WPF Treeview绑定

时间:2012-01-27 18:04:44

标签: c# wpf treeview

我正在尝试将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");
        }
    }

这就是它显示的内容

screenshot

我希望它做的是显示UserViewModel的UserName和作为子项的权限List<string>项。这样做的正确方法是什么?

提前致谢!

3 个答案:

答案 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作为权限,因为我认为您不希望树视图在权限范围之外进一步扩展。 (树可能会扩展,因为权限为stringstrings实现IEnumerable<char>。如果您尝试扩展字符串,则会获得字符串各个字符的列表。)