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的节点?如有任何建议,我们将不胜感激。谢谢
要使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),
};
}
}
一些提示:
- 堆叠面板是多余的
- 如果使用
Text={Binding ...}
进行绑定,则x:Name
是多余的