2010-11-10 45 views
5

Các loại trông như thế này:Làm cách nào để dữ liệu liên kết dữ liệu phân cấp với TreeView WPF?

class Category 
{ 
    public string Name; 
    public string Message; 

    public ObservableCollection<Category> SubCategories; 
} 

nơi mà nó sẽ có tiếng nói 5 loại, trong đó mỗi loại chứa tiểu thể loại từ 0 (không có) để nói 3.

tôi biết làm thế nào để ràng buộc dữ liệu phi thứ bậc đến một TreeView WPF, nhưng không thể tìm ra các giá trị dữ liệu phân cấp.

Trả lời

7

Dưới đây là một ví dụ .....

<!-- Create a TreeView, and have it source data from 
     the AnimalCategories collection --> 
    <TreeView ItemsSource="{x:Static local:Window1.AnimalCategories}"> 

    <!-- Specify the template that will display a node 
     from AnimalCategories. I.e., one each for “Amphibians” 
     and “Spiders” in this sample. It will get its nested 
     items from the "Animals" property of each item --> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Path=Animals}"> 

     <!-- Display the AnimalCategory by showing it's Category string --> 
     <TextBlock FontWeight="Bold" Text="{Binding Path=Category}" /> 

     <!-- Specify the nested template for the individual Animal items 
      that are within the AnimalCategories. E.g. “California Newt”, etc. --> 
     <HierarchicalDataTemplate.ItemTemplate> 
      <DataTemplate> 
      <TextBlock Text="{Binding Path=Name}"/> 
      </DataTemplate> 
     </HierarchicalDataTemplate.ItemTemplate> 

     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
    </TreeView> 

mã này là từ here nó có thể là hữu ích hơn cho bạn để đọc bài viết đó, tôi đang suy nghĩ.

+0

Cảm ơn người đàn ông, tôi sẽ thử ngay bây giờ. –

+0

Thực sự xin lỗi tôi không thể làm việc này trong xaml, chỉ hoạt động trong mã. Vì vậy, những gì tôi sử dụng là: Đối với "{Binding Path = Animals}", tôi đã sử dụng {Binding Path = Categories}. Đối với {Binding Path = Category} sử dụng tương tự, như tôi nghĩ nó có nghĩa là gõ tên của loại, và cho "{Binding Path = Name}", được sử dụng giống nhau, nghĩ rằng đây là thành viên sẽ được hiển thị. –

2

Trước tiên, bạn sẽ muốn biến tất cả các trường đó thành các thuộc tính - ràng buộc dữ liệu WPF không thể liên kết với các trường. (Và sau đó, câu trả lời của Muad'Dib sẽ hoạt động.)

+0

Cảm ơn, vâng đó chỉ là một mẫu nhanh, không muốn viết mã đầy đủ như một ví dụ, nhưng trong mã thực tế, chúng là các thuộc tính. –

1

Tôi biết câu hỏi này đã được hỏi từ lâu rồi .... nhưng có một số rất tốt example trên MSDN mở rộng khi câu trả lời của Muad'Dib.

XAML của họ trông như thế này:

<StackPanel x:Name="LayoutRoot" Background="White"> 
     <StackPanel.Resources> 
      <HierarchicalDataTemplate x:Key="ChildTemplate" > 
       <TextBlock FontStyle="Italic" Text="{Binding Path=Title}" /> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate x:Key="NameTemplate" ItemsSource="{Binding Path=ChildTopics}" ItemTemplate="{StaticResource ChildTemplate}"> 
       <TextBlock Text="{Binding Path=Title}" FontWeight="Bold" /> 
      </HierarchicalDataTemplate> 
     </StackPanel.Resources> 
     <TreeView Width="400" Height="300" ItemsSource="{Binding}" ItemTemplate="{StaticResource NameTemplate}" x:Name="myTreeView" /> 
    </StackPanel> 

tôi thấy cách kết hợp hai để làm việc một cách hoàn hảo đối với tôi.

Các vấn đề liên quan