我的 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;
}
我期待在每个 ClassModel 节点下面看到一个名为“Bob”的 CADmodel 叶子
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<>。
此外,除非有充分的理由,否则当每种对象类型只有一个实现时,无需为每种对象类型创建接口。