【问题标题】:Binding Model to ViewModel (WPF)将模型绑定到 ViewModel (WPF)
【发布时间】:2015-07-04 08:07:52
【问题描述】:

我正在从 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 相同的方法,但这需要 ViewModelModel 作为其构造函数中的依赖项,这似乎使 MVVM 在没有某种形式的情况下直接使用时有点混乱IOC(至少使用 WPF)。

所以,我的两个问题是:

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

【问题讨论】:

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


【解决方案1】:
  1. 这是“纯”MVVM 方法:View 必须仅依赖于ViewModelViewModel 本身就是ViewModel 之间的桥梁。

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

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

    -- Implementing the Model-View-ViewModel Pattern, MSDN.

    结论。将Model 注入ViewModel 似乎是正确的方法。此外,与其注入 Model,不如注入:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2012-02-23
    • 1970-01-01
    • 2011-02-01
    • 2010-12-05
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多