WPF TreeView绑定多个子集合

本文关键字:子集合 绑定 TreeView WPF | 更新日期: 2023-09-27 18:20:54

我正在构建一个应用程序来管理连接、数据库、表等。我需要将一个项目集合与多个子集合绑定(见下文)。我是WPF的新手,不确定这个问题的答案是否已经存在。我已经搜索过了,但没有找到任何我所面临的场景的例子。

server1
-database1
--functions <- "static" node
---function1
---function2
--users <- "static" node
---user1
---user2
-database2
--functions <- "static" node
---function3
---function4
--users <- "static" node
---user3
---user4

当我尝试绑定它时,我可以获得要显示的数据,但它不是上面需要的格式。它是这样显示的。

server1
-database1
--function1
--function2
--user1
--user2

对象层次结构:

class DatabaseViewModel
{
    public string Name
    {
         // normal getters and setters for 2way binding
    }
    public IObservableCollection<DbFunctionViewModel> Functions
    {
         // normal getters and setters for 2way binding
    }
    public IObservableCollection<DbUserViewModel> Users
    {
         // normal getters and setters for 2way binding
    }
}

标记:

<TreeView x:Name="Connections">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type viewModels:DbConnectionViewModel}" ItemsSource="{Binding Databases}">
            <StackPanel Orientation="Horizontal">
                <TextBlock x:Name="Name" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type viewModels:DbDatabaseViewModel}" ItemsSource="{Binding Children}">
            <StackPanel Orientation="Horizontal">
                <TextBlock x:Name="Name" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type viewModels:DbFunctionViewModel}">
            <StackPanel Orientation="Horizontal">
                <TextBlock x:Name="Name" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type viewModels:DbUserViewModel}">
            <StackPanel Orientation="Horizontal">
                <TextBlock x:Name="Name" Text="{Binding UserName}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

我试着返回一个包含两者的CompositeCollection,但它似乎没有按我需要的方式工作。

public IList Children
{
    get
    {
        return new CompositeCollection
        {
            new CollectionContainer { Collection = Functions },
            new CollectionContainer { Collection = Users }
        };
    }
}

我的问题是,如何将所有用户绑定到名为users的节点,并将所有函数绑定到一个名为functions的节点?如有任何建议,我们将不胜感激。谢谢

WPF TreeView绑定多个子集合

要使Children属性工作,您需要为CollectionContainer:定义一个数据模板

<HierarchicalDataTemplate DataType="{x:Type viewModels:CollectionContainer}"
                          ItemsSource="{Binding Collection}">
    <TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>

您应该将string Name属性添加到CollectionContainer:

public IList Children
{
    get
    {
        return new[]
        {
            new CollectionContainer("Functions", Functions),
            new CollectionContainer("Users", Users),
        };
    }
}

一些提示:

  1. 堆叠面板是多余的
  2. 如果使用Text={Binding ...}进行绑定,则x:Name是多余的