2013-03-06 2 views
13

내 TreeView에 대해 ItemsSource를 제공하는 두 개의 다른 클래스가 있습니다.TreeView, HierarchicalDataTemplate 및 재귀 데이터

public class TreeViewModel : ViewModelBase 
{ 
    public ObservableCollection<NodeViewModel> Items { get; set; } 
} 

public class NodeViewModel : ViewModelBase 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public ObservableCollection<NodeViewModel> Children { get; set; } 
} 

이제 TreeViewModel의 항목을 표시하고 NodeViewModel에서 제공하는 계층 적 데이터를 표시하도록 TreeView를 설정합니다.

여기 내 XAML입니다

<Window x:Class="TreeViewMasterDetails.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TreeViewMasterDetails" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TreeView Height="Auto" 
        HorizontalAlignment="Stretch" 
        Margin="10" 
        VerticalAlignment="Stretch" 
        Width="Auto"> 
      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="x:Type local:TreeViewModel" ItemsSource="{Binding Items}"> 
        <TextBlock Text="{Binding Path=Name}"></TextBlock> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="x:Type local:NodeViewModel" ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding Name}"></TextBlock> 
       </HierarchicalDataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
    </Grid> 
</Window> 

TreeViewItemsSourceItems를 제공하기 위해 노력했다. 아무것도 표시하지 않으면 데이터가 계층 적으로 표시되지 않습니다.

TreeView.Resources 대신 ItemTemplate을 사용해 보았습니다.

무엇이 잘못 되었나요?

아마도 처음에는 문제가 TextBlock Text Binding입니까? NodeViewModelName 속성을 Items에 표시하려고합니다.

+0

이 템플릿은 [WPF TreeView HierarchicalDataTemplate - 여러 자식 컬렉션이있는 개체에 바인딩] [1]과 중복 된 것으로 생각됩니다. [1] : http://stackoverflow.com/questions/1912481/wpf-treeview-hierarchicaldatatemplate-binding-to-object-with-multiple-child-co – Schollii

+0

그래, 난 이미 보았다. 그러나 여기서는 효과가 없습니다. –

+0

내 업데이트 된 질문을 참조하십시오 –

답변

3

당신의 데이터 템플릿 정의 (DataType="{x:Type local:TreeViewModel}"이어야 함). 브래킷과 ItemsSource 바인딩을 해결해 문제 추가 :

가 추가 TreeViewModel에 대한 HierarchicalDataTemplate가 사용되지 않습니다,하지만 해가되지 않습니다.

+0

맞습니다. 이것이 정말로 문제입니다. 이상하게도'ItemTemplate'에서 사용할 때 중괄호없이 작동하지만'Resources'에서는 작동하지 않습니다. –

+0

@MareInfinitus 왜냐하면'ItemTemplate' int를 사용할 때'DataType' 속성을 볼 필요가 없기 때문입니다. 'TreeView'에게 아이템에 주어진 템플릿을 사용하도록 직접 말하고 있습니다. 따라서'DataType '이 필요 없습니다. –

23

에만이이 TreeView에 표시하는 유일한 일을 그대로 NodeViewModelHierarchicalDataTemplate를 선언해야하고, TreeView

<TreeView ItemsSource="{Binding Items}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:NodeViewModel}" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}"></TextBlock> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

전체 예

XAML에 실제 ItemSource을 결합해야합니다

<Window x:Class="WpfApplication13.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication13" 
     Title="MainWindow" x:Name="UI" Width="343" Height="744.625" > 

    <TreeView DataContext="{Binding ElementName=UI, Path=TreeModel}" ItemsSource="{Binding Items}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type local:NodeViewModel}" ItemsSource="{Binding Children}"> 
       <TextBlock Text="{Binding Name}"></TextBlock> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

</Window> 

코드 :

(210)
public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public TreeViewModel TreeModel 
    { 
     get 
     { 
      return new TreeViewModel 
      { 
       Items = new ObservableCollection<NodeViewModel>{ 
          new NodeViewModel { Name = "Root", Children = new ObservableCollection<NodeViewModel> { 
           new NodeViewModel { Name = "Level1" , Children = new ObservableCollection<NodeViewModel>{ 
            new NodeViewModel{ Name = "Level2"}}} } }} 
      }; 
     } 
    } 
} 

public class TreeViewModel 
{ 
    public ObservableCollection<NodeViewModel> Items { get; set; } 
} 

public class NodeViewModel 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public ObservableCollection<NodeViewModel> Children { get; set; } 
} 

결과 : @ sa_ddam213, 당신 만 HierarchicalDataTemplateNodeViewModel을 위해 필요하지만, 코드를 가진 유일한 문제에 DataType="x:Type local:TreeViewModel"에 대한 누락 된 중괄호 ({})이었다 말했듯이

enter image description here

+0

예, 작동합니다. 나는 전에 그것을 시도했는지 확신했다. 정말 고맙습니다! –

+0

안녕하세요, 공유 주셔서 감사합니다, 당신의 솔루션을 사용하지만, 그것은 anyhting을 선택하게하지 않는 것 또한 왼쪽에있는 화살표가 누락되었습니다.나무는 얼어 붙어 보인다. 내가 코드에 한 변경 사항은 MainWindow가 아닌 ​​ViewModel 클래스의 TreeModel을 바인딩합니다. –

+0

나를 위해 잘 된. TextBlocks 대신에 전파되는 CheckBox를 원하면 https://stackoverflow.com/questions/2251260/을 참조하십시오. – Chris

관련 문제