将模型绑定到ViewModel(WPF)

时间:2015-04-25 18:43:27

标签: wpf mvvm inversion-of-control prism ioc-container

我正在从MVP迁移到MVVM,并且对于如何最好地将ViewModel绑定到Model有点困惑。我理解我们如何利用WPF的数据绑定基础设施来使用ViewViewModel接口在ICommandINotifyPropertyChanged之间路由事件,例如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相同的方法,但是这需要ViewModelModel作为其构造函数中的依赖项,这似乎使得MVVM在开箱即用时使其有点混乱没有某种形式的IOC(至少有WPF)。

所以,我的两个问题是:

  1. 是将Model注入ViewModel正确的方法,还是应该在INotifyPropertyChanged上实现Model接口并利用WPF的绑定基础架构?
  2. 为了获得MVVM的好处,您是否应该使用IOC和DI容器实现它,或者更好的是Prism?

1 个答案:

答案 0 :(得分:6)

  1. 这是纯粹的&#34; MVVM方法:View必须仅依赖于ViewModelViewModel本身是ViewModel之间的桥梁。

    动机 - ModelViewViewModel的定义和责任以及他们之间的关系:

      
        
    • 模型,提供业务实体的视图无关表示。无论数据在用户界面中的呈现方式如何,模型的设计都针对业务实体之间的逻辑关系和操作进行了优化。
    •   
    • View类,即用户界面。它向用户显示信息并触发事件以响应用户交互。
    •   
    • ViewModel类,它是视图与模型之间的桥梁。每个View类都有一个对应的ViewModel类。 ViewModel从模型中检索数据并将其操作为View 所需的格式。它会通知View是否更改了模型中的基础数据,并且它会更新模型中的数据以响应来自View的UI事件。
    •   
         

    - Implementing the Model-View-ViewModel Pattern, MSDN

    结论。将Model注入ViewModel似乎是正确的方法。另外,注入Model代替注入:

    • Model Factory创建Model - 延迟初始化;
    • ServiceService Facade)来检索Model - 延迟加载。
  2. "MVVM Unleashed" book by Michael Brown所示,可以利用以下MVVM的潜在优势:可维护性,可测试性,可混合性&#34;,可移植性。至少,依赖注入(在所描述的情况下通过使用依赖注入容器)允许设计遵循依赖性反转原则:

      

    依赖倒置的原则是面向对象技术所宣称的许多好处的根源。它的正确应用对于创建可重用框架是必要的。对于能够适应变化的代码构建来说,这一点至关重要。而且,由于抽象和细节都彼此隔离,因此代码更容易维护。

         

    - The Dependency Inversion Principle, Robert C. Martin, 1996

    因此,当遵循依赖性倒置原则时,MVVM的可用性和可测试性似乎得到改善。依赖注入容器只是遵循原则的工具。