模型没有实现INotifyPropertyChanged
本文关键字:INotifyPropertyChanged 实现 模型 | 更新日期: 2023-09-27 18:17:00
在MVVM模式的上下文中,当模型不实现INotifyPropertyChanged接口时,如何构建ViewModel ?
我喜欢保持我的模型尽可能简单,实现INotifyPropertyChanged接口仅用于绑定目的似乎是不必要的复杂性。这就是为什么大多数时候我需要我的虚拟机包装模型属性,就像下面的例子:
class ViewModel : INotifyPropertyChanged
{
private Model model;
public int MyProperty
{
get { return model.MyProperty; }
set
{
if (value != model.MyProperty)
{
model.MyProperty = value;
// Trigger the PropertyChanged event
OnPropertyChanged("MyProperty");
}
}
}
/* ... */
}
这将使绑定工作正常,包括双向绑定。
现在,如果命令执行具有复杂逻辑的模型方法(影响不同对象的许多属性的值)会发生什么?模型没有实现INotifyPropertyChanged,所以我们无法知道它被更新了。我想到的唯一解决方案是使用消息传递(中介模式)将方法的执行通知所有VM,以便每个VM为每个可能受影响的属性触发PropertyChanged事件:
// Sample ICommand.Execute() implementation
public void Execute(object parameter)
{
var model = (Model)parameter;
model.VeryComplexMethod();
// Just an example, the string "VeryComplexMethodExecuted" is
// sent to all listening VMs. Those VMs will in turn fire the
// PropertyChanged event for each property that may have changed
// due to the execution of the complex model method.
Messaging.Broadcast("VeryComplexMethodExecuted");
}
请分享你的想法,谢谢。
声明你的成员为虚拟成员,并使用Castle Dynamic Proxy之类的东西自动注入变更通知:
http://ayende.com/blog/4106/nhibernate-inotifypropertychanged在数据层创建模型时必须小心使用,因为它完全返回一个新实例。您的数据库代码将认为对象已经更改,并再次将其序列化,这反过来会对性能产生巨大影响。幸运的是,所有好的orm都提供了在创建时替换类包装器的机制。