2012-01-27 123 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>。如果你试图扩大一个字符串,你会得到字符串的单个字符的列表。)