WPF MVVM 如何使用 Caliburn Micro 创建具有动态/嵌套数据的 Treeview

WPF MVVM How to create Treeview with dynamic / nested data using Caliburn Micro

我有一个简单的模型如下:

    public class TreeItem : PropertyChangedBase
    {
        private string name;
        public string Name
        {
            get => name;
            set
            {
                name = value;
                NotifyOfPropertyChange(() => Name);
            }
        }

        public ObservableCollection<TreeItem> Children { get; } = new ObservableCollection<TreeItem>();
    }

视图模型:

    public ShellViewModel()
    {
        var data = server.GetData();
        BuildTree(data);
    }

    public ObservableCollection<TreeItem> Root { get; } = new ObservableCollection<TreeItem>();

    private void BuildTreeFromObject( AnObjectType data )
    {
        // it's ok here. I build the tree here
    }

是的,它有嵌套集合。 我从服务器获取数据,它也有嵌套列表。我不知道来自服务器的数据有多少级列表。在 ViewModel 中,我可以构建树来分配 属性 根。但我不确定如何在 XAML.

中编写树视图
<TreeView
    x:Name="TreeView"
    ItemsSource="{Binding Path=Root}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate
            DataType="{x:Type models:TreeItem}"
            ItemsSource="{Binding Path=Children}">
            <TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate
                    DataType="{x:Type models:TreeItem}"
                    ItemsSource="{Binding Path=Children}">
                    <TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate
                            DataType="{x:Type models:TreeItem}"
                            ItemsSource="{Binding Path=Children}">
                            <TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
                            <HierarchicalDataTemplate.ItemTemplate>
                                <HierarchicalDataTemplate
                                    DataType="{x:Type models:TreeItem}"
                                    ItemsSource="{Binding Path=Children}">
                                    <TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
                                    <HierarchicalDataTemplate.ItemTemplate>
                                        <DataTemplate DataType="{x:Type models:TreeItem}">
                                            <TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
                                        </DataTemplate>
                                    </HierarchicalDataTemplate.ItemTemplate>
                                </HierarchicalDataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

如您所见,我的树视图只能处理深度级别 4。如果来自服务器的数据超过 4 级别,我需要更改它:( 谁能告诉我如何使用这种嵌套模型创建动态树视图的内容?非常感谢任何帮助。

您不需要所有这些级别。 我认为只有一个分层数据模板应该可以工作。

<HierarchicalDataTemplate
    DataType="{x:Type models:TreeItem}"
    ItemsSource="{Binding Path=Children}">
    <TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name

}">

叶项只是一个没有 children

的 TreeItem

该模板的意思是,只要您获得类型为 treeitem 的 object,就可以使用该模板。给我一个名称为 header 的带标题的项目控件,然后在项目面板中显示 children。 当它获得树项的 children 时,它们变成了树项,因此它再次将其模板化为相同的......等等。