将多个类绑定到 WPF 树视图

问题描述 投票:0回答:1

我的 Treeview 已正确绑定到 ClassModel,但我将有一些具有子 CADModel 的类模型,我无法让我的继承模板正常工作

提前致谢

马克

<TreeView.Resources>
    <!-- HierarchicalDataTemplate for ClassModel -->
    <HierarchicalDataTemplate DataType= "{x:Type models:ClassModel}" ItemsSource = "{Binding Path=ChildClasses}">
        <TextBlock Text="{Binding Path=ClassName}"/>
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type models:CADModel}">
        <TextBlock Text="{Binding Path=PartNumber}"/>
    </DataTemplate>
</TreeView.Resources>
public interface IClassModel : ITreeNode
{
    ObservableCollection<ClassModel> ChildClasses { get; set; }
    ObservableCollection<CADModel>? CADModels { get; set; }
    int ClassId { get; set; }
    int ParentClassId { get; set; }
    string ClassName { get; set; }
    bool HasChildClass { get; set; }
    LibraryModel? ParentLibrary { get; set; }
}

public class ClassModel : TreeNode, IClassModel
{
    public LibraryModel? ParentLibrary { get; set; } = null;
    public int ParentClassId { get; set; } = 0;
    public int ClassId { get; set; } = 0;
    public string ClassName { get; set; } = string.Empty;
    public bool HasChildClass { get; set; } = false;

    public ObservableCollection<ClassModel> ChildClasses { get; set; } = new ObservableCollection<ClassModel>();
    public ObservableCollection<CADModel>? CADModels { get; set; } = null;

    public ClassModel()
    {
        if (HasChildClass == false)
        {
            CADModels = new ObservableCollection<CADModel>()
            {
                new CADModel()
                {
                    Id = 0,
                    PartNumber = "Bob",
                    Revision = "A.1"
                }
            };
        }
    }
}
public interface ICADModel : ITreeNode
{
    string PartNumber { get; set; }
    string Revision { get; set; }
}
public class CADModel :TreeNode, ICADModel
{
    public string PartNumber { get; set; } = string.Empty;
    public string Revision { get; set; } = string.Empty;
}

enter image description here

我期待在每个 ClassModel 节点下面看到一个名为“Bob”的 CADmodel 叶子

wpf data-binding treeview
1个回答
0
投票

A

HierarchicalDataTemplate
只能绑定到其
Children
的单个集合。

因此,在您的

ClassModel
中添加一个新的计算属性

public List<TreeNode> AllChildren => ChildClasses.Cast<TreeNode>().Union(CADModels).ToList();

并更改

ItemsSource
HierarchicalDataTemplate
的绑定以引用这个新的
AllChildren
属性。

虽然

AllChildren
列表只是
TreeNode
项的集合,但 TreeView 控件将检查每个子项的实际类型并为每个子项使用指定的数据模板。

特定 ClassModel 是否可以具有子类或 CAD 模型,或两者都没有关系。

如果您确实要在树显示后添加子类或 CAD 模型,那么您将需要处理 ObservableCollections 的

CollectionChanged
事件来刷新此 AllChildren 属性。如果没有,请将 ObservableCollection<> 声明的属性替换为 List<>。

此外,除非有充分的理由,否则当每种对象类型只有一个实现时,无需为每种对象类型创建接口。

© www.soinside.com 2019 - 2024. All rights reserved.