gpt4 book ai didi

c# - ViewModel 之间的 WPF 数据绑定(bind)

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

我有一个问题,我无法正确措辞,因此还没有找到令人满意的答案。也许这里有人可以指出我正确的方向。

我在 WPF 中使用 MVVM 来创建类似 UML 的建模工具。出于所有意图和目的,让我们坚持使用 UML 类比。

我基本上有 4 个相关的 ViewModel:CanvasViewModel、ClassViewModel、MemberViewModel、TypeViewModel。它们都实现了相同的接口(interface),公开了一个 bool Valid 属性。

可以想象,有 1 个全局 Canvas, Canvas 上有 n 个类,一个类中有 n 个成员,每个成员有 1 个类型。它可以这样表示:

Canvas
{
Person (Class)
{
Age (Member)
{
int (Type)
}
Name (Member)
{
string (Type)
}
}
House (Class)
{
Price (Member)
{
currency (Type)
}
}
}

它实现了这样的一个画面:( http://www.tutorialspoint.com/uml/images/uml_class_diagram.jpg )

我将 CanvasViewModel.Valid 绑定(bind)到 Canvas 以显示一个大红色搜索灯,如果它是假的。
如果它为假,我将 ClassViewModel.Valid 绑定(bind)到类框以执行摆动动画。
如果它是假的,我将 MemberViewModel.Valid 绑定(bind)到 ListView 以闪烁红色。
我将 TypeViewModel.Valid 绑定(bind)到任何内容。

当然,Valid 属性的实现非常简单(代码未经测试):
// CanvasViewModel
public bool Valid { get { return Classes.All(x => x.Valid); } }

// ClassViewModel
public bool Valid { get { return Members.All(x => x.Valid); } }

// MemberViewModel
public bool Valid { get { return Type.Valid; } }

所以这里的用例是:用户不小心将TypeViewModel设置为“innt”,这是一个无效的类型。我希望所有 4 个 ViewModel 然后将其 Valid 属性评估为 false。我希望这个事件通过所有正确的 ViewModel 传播(从类型 -> 成员 -> 类 -> Canvas )。

我到底如何做到这一点,而不必在我的代码中到处摆弄可怕的行,例如
var memberViewModel = new MemberViewModel(member);
memberViewModel.PropertyChanged += (o, e) => { if ( e.PropertyName == "Valid") OnPropertyChanged("Valid"); }
Members.Add(memberViewModel);

我不想像这样把我的功能串在一起。我更喜欢干净的绑定(bind),具有清晰的进入/退出、获取/设置或添加/删除功能。

所以是的,不是 ViewModel 和 GUI 之间的绑定(bind),而是 ViewModel 之间的绑定(bind)。我尝试使用 OnPropertyChanged 和 CoerceValue。但他们的目的对我来说并不完全清楚。在我的情况下,成员 OnPropertyChanged 实现看起来就像这样
public static void OnPropertyChanged(...)
{
MyParentClass.CoerceValue(ClassViewModel.ValidProperty);
}

我想这不会太糟糕,除非我不知道 CoerceValue 实际上有什么责任。评估是否在那里进行?该属性是否假定 CoerceValue 的返回值?是否像常规属性中的 OnPropertyChanged 代表“set”而 CoerceValue 代表“get”一样简单?无论如何,我没有让它工作,所以我怀疑我是否正确理解了它的目的。无论如何,所有使用 OnPropertyChanged/CoerceValue 的示例基本上都处理同一类中的 DependencyProperties(从不跨类)。

任何想法如何解决这个相当普遍的问题?

干杯,

雷内

最佳答案

处理这种情况的设计模式讨论得很好here .
在您的情况下,我喜欢选项 1,您在每个子项中都持有对父对象的引用。然后,您将调用从属性 setter 中的子级更改的父级属性。这可能是最简单的解决方案,但它确实引入了父子耦合,但您似乎不会有他们所描述的相同问题。我建议将 IValidating 传递给 child 的构造函数并在 setter 中检查它是否为 null。如果您使用的是 mvvm 框架,您还可以查看消息总线模式

关于c# - ViewModel 之间的 WPF 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217296/

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