2013-03-06 23 views
13

Ağaç görünümü için ItemsSource'u sağlayan iki farklı sınıfa sahibim.TreeView, HierarchicalDataTemplate ve özyinel Veriler

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; } 
} 

Şimdi TreeViewModel Öğeleri görüntülemek ve NodeViewModel tarafından sağlanan hiyerarşik verileri göstermek için benim TreeView istiyorum.

İşte benim XAML olan

<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> 

TreeView ait ItemsSource olarak Items sağlamak denediniz. Bir şey görüntüleniyorsa, verileri hiyerarşik olarak göstermez.

Ayrıca TreeView.Resources yerine ItemTemplate kullanmayı denedim.

Bu konuda yanlış olan nedir? İlk TextBlock Text Binding? NodeViewModel'un ItemsName özelliğini burada görüntülemek istiyorum.

+0

Sanırım bu, [WPF TreeView HierarchicalDataTemplate - çoklu çocuk koleksiyonları ile nesneye bağlanma] 'nın bir kopyasıdır [1]. [1]: http://stackoverflow.com/questions/1912481/wpf-treeview-hierarchicaldatatemplate-binding-to-object-with-multiple-child-co – Schollii

+0

Evet, zaten gördük. Ama burada çalışmıyor. –

+0

Lütfen güncellenmiş sorumu inceleyin –

cevap

3

senin veri şablonu tanımları (DataType="{x:Type local:TreeViewModel}" olmalıdır). Köşeli parantezler eklenmesi ve ItemsSource bağlaması, sorunu çözer:

TreeViewModel için HierarchicalDataTemplate eki kullanılmaz, ancak zarar vermez.

+0

Haklısın, bu gerçekten sorun. Garip bir şekilde, 'ItemTemplate' içinde kullanıldığında parantez olmadan çalışır, ancak 'Kaynaklar' içinde değil. –

+0

@MareInfinitus Çünkü int "ItemTemplate" kullanıldığında, 'DataType' özelliğine bakmaya gerek yoktur. Öğeler için verilen şablonu kullanmak için doğrudan TreeView öğesine söylüyorsunuz. Yani 'DataType' gerek yok. –

23

Yalnızca bu TreeView içinde gösteren tek şey olduğu gibi NodeViewModel için HierarchicalDataTemplate beyan etmek zorunda ve 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> 

Tam Örnek

Xaml fiili ItemSource bağlamak gerekir:

<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> 

Kod:

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; } 
} 

Sonuç: @ sa_ddam213, sadece HierarchicalDataTemplateNodeViewModel için gerekmeyebilir, ancak koduyla tek sorun içinde DataType="x:Type local:TreeViewModel" eksik ayraçları ({ ve }) idi söylediği gibi

enter image description here

+0

Evet, işe yarıyor. Bunu daha önce denediğime emin oldum. Çok teşekkür ederim! –

+0

Merhaba, paylaştığınız için teşekkürler, çözümünüzü kullandım, ancak herhangi bir seçim yapmama izin vermiyor gibi görünüyor ve soldaki oklar da eksik.Ağaç donmuş görünüyor. Size yaptığım bir değişiklik, TreeModel'i ViewModel sınıfımdan MainWindow'dan değil. –

+0

Benim için iyi çalıştı. Ayrıca, TextBlocks yerine yayılan CheckBox'lar istiyorsanız https://stackoverflow.com/questions/2251260/ adresini ziyaret edin. – Chris