我希望在模型中的属性更改时执行 methodToBeCalledWhenPropertyIsSet() 。
我怎么能这样做呢?
如果我理解正确的话,我可以添加MyModel.PropertyChanged += methodToBeCalledWhenPropertyIsSet
一般情况下,我的 ViewModel 中的某个位置可以订阅 PropertyChanged 事件,但我只关心何时设置 Property
public class ViewModel : INotifyPropertyChanged
{
...
public Model MyModel { get; set; }
public void methodToBeCalledWhenPropertyIsSet() { }
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Model : INotifyPropertyChanged
{
object _propertyField;
public object Property
{
get
{
return _propertyField;
}
set
{
_propertyField = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
INotifyPropertyChanged 接口解决了这个问题。将您的视图模型订阅到模型 PropertyChangedEventHandler 并过滤您的结果。
public class ViewModel : INotifyPropertyChanged
{
...
public Model MyModel { get; set; }
public void methodToBeCalledWhenPropertyIsSet() { }
public event PropertyChangedEventHandler PropertyChanged;
public ViewModel()
{
// MyModel would need to be set in this example.
MyModel.PropertyChanged += Model_PropertyChanged;
}
private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if(e.PropertyName == "Property")
{
methodToBeCalledWhenPropertyIsSet();
}
}
}
在 MVVM 模式中,视图模型旨在处理这样的混乱情况。这仍然保留了您对模型的抽象。
Edit正如 HighCore 指出的,此代码无法复制粘贴。 MyModel 需要事先实例化。我用MEF(http://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx) 以此目的。您可以直接获取模型类,也可以使用某种工厂/管理器来获取引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)