我有以下类:
class Component
{
ComponentType ComponentType {get; set;}
string Name {set; set;}
List<Component> SubComponents {get; set;}
}
enum ComponentType
{
Feature,
Role
}
以及我的VM A List<Component> AllComponents {get;}
,其中包含我的组件的所有,而不论ComponentType
。
我想,而不必通过ComponentType
分开我的Component
,请在TreeView
中显示它们:
Roles
ComponentA
ComponentB
ComponentC
ComponentD
ComponentE
Features
ComponentF
ComponentG
ComponentH
ComponentI
但我真的不确定如何在WPF中执行此操作,而不必创建两个单独的List<Component>
或一个Dictionary<ComponentType, Component>
(我也想避免)。
如此简单的问题,有没有办法只需xaml?
ps:所有SubComponents
总是与父母相同的ComponentType
。
AllComponens
应该包含两个层次结构 Component
对象 - 带有"角色"one_answers"特征"的名称,代表每个树的根。
然后,"角色"对象的SubComponents
属性应包含其他三个Component
对象(Componenta,b和e),并且"功能"对象的SubComponents
属性还应包含三个子对象(F,G和I),例如:
public List<Component> AllComponents { get; } = new List<Component>()
{
new Component(){ Name = "Roles", SubComponents = new List<Component>(){ new Component() { Name = "A" }, new Component() { Name = "B" }, new Component() { Name = "E" } } },
new Component(){ Name = "Features",SubComponents = new List<Component>(){ new Component() { Name = "F" }, new Component() { Name = "G" }, new Component() { Name = "I" } } }
};
如果您在视图模型中像这样组织数据,则可以使用以下TreeView表示您的层次结构:
<TreeView ItemsSource="{Binding AllComponents}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SubComponents}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
我已经用treeviewItemModel做到了这一点:
public class TreeViewItemViewModel : BindableBase
{
private string _name;
private TreeViewItemViewModel _parent;
private List<TreeViewItemViewModel> _childern;
public TreeViewItemViewModel(TreeViewItemViewModel parent, string name)
{
_parent = parent;
_name = name;
_childern = new List<TreeViewItemViewModel>();
}
public string Name
{
get
{
return _name;
}
}
public TreeViewItemViewModel Parent
{
get
{
return _parent;
}
}
public List<TreeViewItemViewModel> Children
{
get
{
return _childern;
}
}
public void AddChild(TreeViewItemViewModel c)
{
_childern.Add(c);
RaisePropertyChanged(nameof(Children));
}
}
然后您只需要:
<TreeView Grid.Row="1" Grid.Column="0" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
ItemsSource="{Binding TreeItemsUserSearch}"
IsEnabled="{Binding TreeEnabled}">
<i:Interaction.Behaviors>
<b:TreeViewSelectedItemBehavior SelectedItem="{Binding SelectedTreeItemUserSearch}" />
</i:Interaction.Behaviors>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
在您的ViewModel中,您只需要:
private List<TreeViewItemViewModel> _treeItemsUserSearch;
public List<TreeViewItemViewModel> TreeItemsUserSearch
{
get
{
return _treeItemsUserSearch;
}
}
然后,您可以创建所需的每个strukture