模型没有实现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");
}

请分享你的想法,谢谢。

模型没有实现INotifyPropertyChanged

声明你的成员为虚拟成员,并使用Castle Dynamic Proxy之类的东西自动注入变更通知:

http://ayende.com/blog/4106/nhibernate-inotifypropertychanged

在数据层创建模型时必须小心使用,因为它完全返回一个新实例。您的数据库代码将认为对象已经更改,并再次将其序列化,这反过来会对性能产生巨大影响。幸运的是,所有好的orm都提供了在创建时替换类包装器的机制。