【发布时间】: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