TreeView WPF具有多个级别



我有以下类:

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

最新更新