2012-01-27 135 views
2

我試圖將一個ObservableCollection綁定到WPF中的treeview。它確實是一種工作,但不像我想的那樣。WPF Treeview綁定

這是結合我已經安裝

<TreeView Height="250" ItemsSource="{Binding Path=TheUsers}" VerticalAlignment="Bottom" Width="500" Margin="0,39,0,0"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=Permission}"> 
       <TextBlock Text="{Binding}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

這是它被綁定到集合:

ObservableCollection<UserViewModel> theUsers; 
    public ObservableCollection<UserViewModel> TheUsers 
    { 
     get 
     { 
      return theUsers; 
     } 
     set 
     { 
      theUsers = value; 
      OnPropertyChanged("TheUsers"); 
     } 
    } 

這是集合中的對象:

public class UserViewModel 
{  
    string userName = null; 
    public string UserName 
    { 
     get 
     { 
      return userName; 
     } 
     set 
     { 
      userName = value; 
      OnPropertyChanged("UserName"); 
     } 
    } 

    int permCount = 0; 
    public int PermCount 
    { 
     get 
     { 
      return permCount; 
     } 
     set 
     { 
      permCount = value; 
      OnPropertyChanged("PermCount"); 
     } 
    } 

    List<string> permission = null; 
    public List<string> Permission 
    { 
     get 
     { 
      return permission; 
     } 
     set 
     { 
      permission = value; 
      OnPropertyChanged("Permission"); 
     } 
    } 

這是它顯示

screenshot

我想它做的是顯示UserViewModel用戶名和權限List<string>的項目,如兒童。什麼是正確的方法來做到這一點?

先謝謝了!

回答

1

你應該能夠在另外一個HierarchicalDataTemplate這樣做是爲了正常DataTemplate

<TreeView Height="250" ItemsSource="{Binding Path=TheUsers}" VerticalAlignment="Bottom" Width="500" Margin="0,39,0,0"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Permission}"> 
      <TextBlock Text="{Binding Path=UserName}" /> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type sys:String}" > 
      <TextBlock Text="{Binding}" /> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

下面的命名空間添加到你的控制/窗口:

xmlns:local="clr-namespace:WhateverYourAssemblyNamespaceIs" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
+0

改變代碼來反映意見,更新問題 – rreeves 2012-01-27 18:31:14

+0

@BatMasterson:我更新了我的答案 – ChrisWue 2012-01-27 22:16:39

2

使用HierarchicalDataTemplate像

<TreeView.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Permission}" > 
     <TextBlock Text="{Binding UserName}"/> 
    </HierarchicalDataTemplate> 
</TreeView.Resources> 
0

隨着一點幫助fr om the MSDN DataTemplating overview,我想下面會做你想要的。請注意,我添加了一個頂級「所有用戶」項到TreeView:

<Window.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Path=Permission}"> 
     <TextBlock Text="{Binding Path=UserName}"/> 
    </HierarchicalDataTemplate> 
    <DataTemplate DataType="{x:Type sys:String}"> 
     <TextBlock Text="{Binding}"/> 
    </DataTemplate> 
</Window.Resources> 

... 

<TreeView Height="250" VerticalAlignment="Bottom" Width="500" Margin="0,39,0,0"> 
    <TreeViewItem ItemsSource="{Binding Path=TheUsers}" Header="All Users" /> 
</TreeView> 

綁定到你的UserViewModel類生活在命名空間的命名空間前綴替換前綴local

你可以如果您希望樹狀視圖顯示並且所有用戶項展開,請在<TreeViewItem>上設置IsExpanded="True"

請注意,我使用普通的DataTemplate作爲權限,因爲我不認爲您希望樹視圖進一步擴展超出權限。 (樹可能會擴大,因爲權限是string s和strings實施IEnumerable<char>。如果你試圖擴大一個字符串,你會得到字符串的單個字符的列表。)