我正在尝试将ObservableCollection绑定到WPF中的树视图。它做的很好,但不像我想的那样。
这是我设置的绑定
<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");
}
}
这就是它显示的内容
我希望它做的是显示UserViewModel的UserName和作为子项的权限List<string>
项。这样做的正确方法是什么?
提前致谢!
答案 0 :(得分:2)
使用像
这样的HierarchicalDataTemplate<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Permission}" >
<TextBlock Text="{Binding UserName}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
答案 1 :(得分:1)
除了正常的DataTemplate
之外,你应该能够HierarchicalDataTemplate执行此操作:
<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"
答案 2 :(得分:0)
在the MSDN DataTemplating overview的帮助下,我认为以下内容可以满足您的需求。请注意,我已在树视图中添加了顶级“所有用户”项:
<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>
将前缀local
替换为绑定到UserViewModel类所在命名空间的名称空间前缀。
如果您希望在展开“所有用户”项目的情况下显示树视图,则可以在IsExpanded="True"
上设置<TreeViewItem>
。
请注意,我使用普通DataTemplate
作为权限,因为我认为您不希望树视图在权限范围之外进一步扩展。 (树可能会扩展,因为权限为string
,string
s实现IEnumerable<char>
。如果您尝试扩展字符串,则会获得字符串各个字符的列表。)