将模型绑定到视图模型(WPF)

6

我正在从MVP转向MVVM,但对于如何最好地将ViewModel绑定到Model有些困惑。我知道我们可以利用WPF的数据绑定基础结构使用ICommandINotifyPropertyChanged接口在ViewViewModel之间路由事件,例如,在View中:

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的引用,并在Presenter中触发Model的事件,以更新Model中的数据。我尝试在MVVM中采用同样的方法,但这要求ViewModel在其构造函数中将Model作为依赖项,而如果直接使用MVVM(至少是用WPF)可能会使事情变得有些混乱。

因此,我的两个问题是:

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

相关问题:https://dev59.com/rXLYa4cB1Zd3GeqPdvl3。 - Sergey Vyacheslavovich Brunov
相关问题:https://dev59.com/tmQn5IYBdhLWcg3wZGZ4 - Sergey Vyacheslavovich Brunov
相关问题:https://dev59.com/93RA5IYBdhLWcg3w8ikl - Sergey Vyacheslavovich Brunov
相关问题:https://dev59.com/RW035IYBdhLWcg3wbPjc - Sergey Vyacheslavovich Brunov
1个回答

8
  1. 这是“纯”MVVM方法: View 只能依赖于 ViewModelViewModel 本身是 ViewModel 之间的桥梁。

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

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

    -- 实现模型-视图-视图模型模式,MSDN

    结论。将 Model 注入到 ViewModel 中似乎是正确的方法。此外,可以注入以下内容而不是注入 Model

    • Model 工厂 以创建 Model - 惰性初始化;
    • Service(服务)Service Facade(服务外观))以检索 Model - 惰性加载。
  2. 如 Michael Brown 的 “MVVM Unleashed” 一书所示,可以利用以下 MVVM 潜在优势:可维护性,可测试性,“混合性”,可移植性。至少,在所述情况下使用依赖注入容器进行依赖注入允许设计遵循依赖反转原则:

    依赖反转原则是面向对象技术中许多好处的根源。其适当应用对于创建可重用框架是必要的。它对于构建对变化具有弹性的代码也非常重要。由于抽象和细节都相互隔离,因此代码更易于维护。

    -- 依赖反转原则,Robert C. Martin,1996

    因此,当遵循依赖反转原则时,MVVM 的可维护性和可测试性等优点似乎得到了改进。依赖注入容器只是遵循该原则的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接