【发布时间】:2023-03-22 00:00:02
【问题描述】:
我的视图模型中有几个由视图引用的只读属性,其中一些依赖于一个/多个其他只读属性(在同一视图模型中),这些属性最终依赖于一个/多个读/写属性(在同一个视图模型中)。我只在示例中看到了以下模式,以确保为所有可能受影响的属性引发 PropertyChanged 事件,但我不喜欢复制所有这些 RaisePropertyChanged 调用。
我怀疑我应该将一个处理程序添加到我的视图模型的 PropertyChanged 事件中,并且在该处理程序中,对于每个具有依赖属性的属性,仅在 直接的属性上调用 RaisePropertyChanged (相对于那些间接)依赖于该属性。如何避免重复所有这些 RaisePropertyChanged 调用?
public bool MyReadOnlyPropertyAA1
{
get
{
return MyReadOnlyPropertyA1 [&& MyReadOnlyPropertyB1 ...]
}
}
public bool MyReadOnlyPropertyA1
{
get
{
return (MyPropertyA == (Some Value)) [&& MyPropertyB == (Some Other Value)) ... ]
}
}
public MyPropertyAType MyPropertyA
{
get
{
return myPropertyA
}
set
{
myPropertyA = value;
RaisePropertyChanged(nameof(MyPropertyA));
RaisePropertyChanged(nameof(MyReadOnlyPropertyA));
RaisePropertyChanged(nameof(MyReadOnlyPropertyA1));
RaisePropertyChanged(nameof(MyReadOnlyPropertyAA1));
...
RaisePropertyChanged(nameof(MyReadOnlyPropertyAA...1));
}
}
public MyPropertyBType MyPropertyB
{
get
{
return myPropertyB
}
set
{
myPropertyB = value;
RaisePropertyChanged(nameof(MyPropertyB));
RaisePropertyChanged(nameof(MyReadOnlyPropertyA));
RaisePropertyChanged(nameof(MyReadOnlyPropertyA1));
RaisePropertyChanged(nameof(MyReadOnlyPropertyAA1));
...
RaisePropertyChanged(nameof(MyReadOnlyPropertyAA...1));
}
}
【问题讨论】:
-
触发只读属性的属性更改事件是愚蠢的高度。如果你给代码的用户一个属性是只读的印象,让它保持这种状态。设计不应该改变其他一些属性对其产生影响
-
@MickyD 仅仅因为属性是只读的,并不意味着该属性的值是恒定的。这只是意味着你不能通过他们的 setter 修改属性。
-
@MickyD 为什么,只是为了获取一些信息(例如,连接两个字符串,或者一个简单的计算),一个方法并没有多大帮助。拥有属性可以让您轻松绑定派生信息。
-
不知道为什么你会得到一堆反对票,但我最好的猜测是“What are some / is the best way...”这行。这里的人们有时会过于字面地理解这种方式,并将其视为“要求列出事物”,因此因过于宽泛而反对。我建议您提出更具体的核心问题,例如 “如何避免在属性设置器中重复 RaisePropertyChanged 调用?”。就我个人而言,我不认为这是一个坏问题,而且是我早年在 SO 上可能会问的一个问题。
-
@Rachel:谢谢!我进行了编辑。显然,在 SO 上,“问起来(确实)很痛!”。嘘!
标签: c# mvvm viewmodel inotifypropertychanged