我正在从MVP迁移到MVVM,并且对于如何最好地将ViewModel
绑定到Model
有点困惑。我理解我们如何利用WPF的数据绑定基础设施来使用View
和ViewModel
接口在ICommand
和INotifyPropertyChanged
之间路由事件,例如View
:< / p>
public class MyView
{
public MyView()
{
InitializeComponent();
DataContext = new MyViewModel();
}
}
和ViewModel
:
public class MyViewModel : INotifyPropertyChanged
{
public MyViewModel(){}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
public ICommand MyCommand ...
}
这很棒!
现在,通常使用MVP我会让Presenter
通过构造函数注入来引用Model
,并将Model
上的事件从Presenter
引发到更新Model
中的数据。我尝试了与MVVM相同的方法,但是这需要ViewModel
将Model
作为其构造函数中的依赖项,这似乎使得MVVM在开箱即用时使其有点混乱没有某种形式的IOC(至少有WPF)。
所以,我的两个问题是:
Model
注入ViewModel
正确的方法,还是应该在INotifyPropertyChanged
上实现Model
接口并利用WPF的绑定基础架构? 答案 0 :(得分:6)
这是纯粹的&#34; MVVM方法:View
必须仅依赖于ViewModel
。 ViewModel
本身是View
和Model
之间的桥梁。
动机 - Model
,View
和ViewModel
的定义和责任以及他们之间的关系:
- 模型,提供业务实体的视图无关表示。无论数据在用户界面中的呈现方式如何,模型的设计都针对业务实体之间的逻辑关系和操作进行了优化。
- View类,即用户界面。它向用户显示信息并触发事件以响应用户交互。
- ViewModel类,它是视图与模型之间的桥梁。每个View类都有一个对应的ViewModel类。 ViewModel从模型中检索数据并将其操作为View 所需的格式。它会通知View是否更改了模型中的基础数据,并且它会更新模型中的数据以响应来自View的UI事件。
结论。将Model
注入ViewModel
似乎是正确的方法。另外,注入Model
代替注入:
Model Factory
创建Model
- 延迟初始化; Service
(Service Facade
)来检索Model
- 延迟加载。如"MVVM Unleashed" book by Michael Brown所示,可以利用以下MVVM的潜在优势:可维护性,可测试性,可混合性&#34;,可移植性。至少,依赖注入(在所描述的情况下通过使用依赖注入容器)允许设计遵循依赖性反转原则:
依赖倒置的原则是面向对象技术所宣称的许多好处的根源。它的正确应用对于创建可重用框架是必要的。对于能够适应变化的代码构建来说,这一点至关重要。而且,由于抽象和细节都彼此隔离,因此代码更容易维护。
- The Dependency Inversion Principle, Robert C. Martin, 1996。
因此,当遵循依赖性倒置原则时,MVVM的可用性和可测试性似乎得到改善。依赖注入容器只是遵循原则的工具。