【发布时间】:2015-06-09 20:22:34
【问题描述】:
我在 ViewModel 中有一些属性会根据模型属性更新进行更新/重新计算。我要求实现这种情况的最佳方法?
我不喜欢订阅模型的 PropertyChanged 事件处理程序然后更新 ViewModel 属性的方法。您如何处理这种情况?
【问题讨论】:
我在 ViewModel 中有一些属性会根据模型属性更新进行更新/重新计算。我要求实现这种情况的最佳方法?
我不喜欢订阅模型的 PropertyChanged 事件处理程序然后更新 ViewModel 属性的方法。您如何处理这种情况?
【问题讨论】:
订阅事件是正确的方法,但我同意你不想使用 PropertyChanged 事件的观点。我喜欢不理会该事件并根据需要创建自己的事件。这是我的方法:
public class Person : INotifyPropertyChanged
{
//custom events as needed
public event EventHandler NameChanged = delegate { };
//needed for INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
this.NotifyPropertyChanged();
//Fire my custom event
this.NameChanged(this, EventArgs.Empty);
}
}
}
private int _age;
public int Age
{
get { return _age; }
set
{
if (_age != value)
{
_age = value;
this.NotifyPropertyChanged();
//I am not exposing a custom event for this property.
}
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
在此示例中,Name 和 Age 对于 UI 目的是可观察的,但 Name 对于 UI 之外的任何内容都是可观察的。现在,如果您删除任何 PropertyChanged 通知,如果您的 ViewModel 订阅了 PropertyChanged 并解析字符串,则不会意外导致该运行时错误。
【讨论】:
由于您不想将视图模型的依赖项放在模型内部,因此在视图模型中监听模型更改确实是更新基于模型的视图模型属性的正确方法。
【讨论】: