【问题标题】:Model not implementing INotifyPropertyChanged模型未实现 INotifyPropertyChanged
【发布时间】:2014-09-30 18:16:17
【问题描述】:

在 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");
}

请分享您的想法,谢谢。

【问题讨论】:

  • @Sheridan 你的意思是模型是纯数据的吗?你把逻辑放在哪里?在命令本身(或在 VM 方法中,它是相同的)?如果应用程序是棋类游戏怎么办?人工智能不是模型的一部分吗?
  • 一般来说:我将我的模型视为数据和业务逻辑。我的虚拟机在那里以对视图 (xaml) 有意义的方式公开模型。 VM 还将提供命令,以便视图上的输入事件可以触发某些逻辑(任何类型)。
  • @Sheridan 那么国际象棋 AI 会进入虚拟机吗?我不认为这是 VM 的责任。
  • 我不喜欢模型知道有人会绑定到它
  • @sheridan '没有逻辑进入模型'的概念绝对不是 MVVM。 “没有显示逻辑”是的,但不是“没有逻辑”。模型并不总是只是数据。在这种特殊情况下,假设某些操作需要时间(例如计算移动),我将查看我的模型如何发出“准备就绪”的信号。此消息不会与 UI 实现相关联,但应该是 VM 需要担心的问题,以便它可以确保其对模型的了解是准确的和最新的。

标签: c# wpf silverlight mvvm


【解决方案1】:

将您的成员声明为虚拟并使用 Castle Dynamic Proxy 之类的工具自动注入更改通知:

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

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

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 2011-10-18
    • 2020-07-25
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多