gpt4 book ai didi

c# - MVVM:在 TreeViewItem 中使用 IsExpanded 和 IsSelected 扩展只读模型

转载 作者:行者123 更新时间:2023-12-03 10:42:43 25 4
gpt4 key购买 nike

考虑 ViewModel暴露在 Model 中定义的树,然后将其数据绑定(bind)到 TreeView .树相当大,直接使用模型,因为它对于 View 本质上是只读的。现在,TreeView生活在 TabControl在 VisualTree 中,所以此时的问题是 IsExpandedIsSelected在选项卡之间切换时不会保留属性。犹豫是否将这些 bool 属性添加到 Model 中的每个节点, 因为这应该在 ViewModel 中扩展作为原则问题。这棵树是由多态节点组成的,所以如果我们要创建一个 ViewModel从树节点类型派生并添加这些属性的节点类型,这似乎会导致 ViewModel 中的一些毛茸茸的代码:

也就是说,如果树有一个抽象 NodeBase , 然后是派生类型 Node1 , Node1 , ... NodeN (ModelNode s)。 ViewModel然后必须封装这些节点,所以在创建 ViewModelNode 时, 如果它引用了 Node以及对 child 的引用ViewModelNode的每个后代 ViewModelNode封装每个后代 Model的节点一直沿树向下,在 ViewModel 中维护这些子引用与它们在 Model 中的维护方式相同。 ,以及对 Model 的引用.即 Model 中的所有引用节点复制到 ViewModel节点,为每个 ModelViewModel 封装的节点节点。诸如此类的冗余引用的存在,即使在 ViewModelNode 中处理。的构造函数,只是闻起来很糟糕。

在这种情况下,在不大规模复制上述引用的情况下,扩展树中每个节点的最常用方法是什么? (而在次要的一点上,仅仅提到直接使用该模型是一种不可饶恕的罪行,还是由于当时的情况而被饶恕?)

最佳答案

可能有人认为在模型上实现这些 bool 属性是可以的,但我个人希望为将在 TreeView 中的每个模型创建 ViewModel。 .如果您决定实现更多与 TreeView 相关的功能,这样做的一个好处可能是增加了可伸缩性。 .

我认为这取决于您实际使用 TreeView 做了多少工作。 (在您的应用程序中),但我确实认为您做的越多,基于 ViewModel 的解决方案的论据就越强。

关于毛茸茸的代码,您也许可以通过使用 interface 在一定程度上规避这一点。描述你的TreeView成员,例如:

public interface IMyTreeViewItem
{
bool TreeViewItemIsSelected { get; set; }
bool TreeViewItemIsExpanded { get; set; }

// Further potential properties

string TreeViewItemHeaderText { get; set; }
List<IMyTreeViewItem> TreeViewItemChildren { get; set; }
}

这种方法可用于确保您的 TreeView成员已正确“订阅”。然后还有一个选项来引用 interface输入 XAML,例如 TargetTypeHierarchicalDataTemplate对于 TreeView .

关于c# - MVVM:在 TreeViewItem 中使用 IsExpanded 和 IsSelected 扩展只读模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com