您了解wpf+mvvm
中更新计算字段的最佳做法吗?
我该怎么做OnPropertyChanged(nameof(Summary))
呢?
计算字段也可以在另一个视图模型中,并且该视图模型不应该知道所有依赖关系。
这是我的代码:
public class Model
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Summary => Prop1 + Prop2;
}
public class ViewModel : BaseViewModel
{
public Model Model { get; }
public int Prop1
{
get
{
return Model.Prop1;
}
set
{
Model.Prop1 = value;
OnPropertyChanged();
OnPropertyChanged(nameof(Summary));
}
}
public int Prop2
{
get
{
return Model.Prop2;
}
set
{
Model.Prop2 = value;
OnPropertyChanged();
OnPropertyChanged(nameof(Summary));
}
}
public int Summary => Model.Summary;
}
答案 0 :(得分:2)
在计算所得的属性上调用OnPropertyChanged
是完全可以接受的。如果您有一个相对简单的模型(如您编写的模型)就足够了。
如果模型上具有多个计算出的属性,则可以考虑创建一个方法来从一个位置调用所有这些属性,而不是从每个属性中调用每个属性。
类似这样的东西:
public int Prop1
{
get
{
return _prop1;
}
set
{
_prop1 = value;
OnPropertyChanged();
NotifyCalculatedProperties();
}
}
public int Calc1 { get { /* ... */ } }
public int Calc2 { get { /* ... */ } }
public int Calc3 { get { /* ... */ } }
public void NotifyCalculatedProperties()
{
OnPropertyChanged(nameof(Calc1));
OnPropertyChanged(nameof(Calc2));
OnPropertyChanged(nameof(Calc3));
}
如果计算出的属性存在于其他模型中,则可以在该Model \ VM中注册到源的PropertyChanged
事件,然后在该事件中调用更改通知。
喜欢:
void ModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if(e.PropertyName == "Prop1")
OnPropertyChanged(nameof(Calc1));
OnPropertyChanged(nameof(Calc2));
OnPropertyChanged(nameof(Calc3));
}
当Model \ VM更改时,别忘了退订,否则您的内存会泄漏。
最后,您始终可以使用Messenger在不相关的VM之间传递消息,尽管您应谨慎使用,因为它是一个非常强大的工具,很容易被滥用。
我不知道您使用的是什么MVVM框架,但是每个都有自己的实现。您可以在此处找到有关Messenger模式的更多常规详细信息:https://msdn.microsoft.com/en-us/magazine/jj694937.aspx