【问题标题】:MVVM Modelview to View要查看的 MVVM 模型视图
【发布时间】:2011-05-07 17:30:19
【问题描述】:

据我了解,ViewModel 通过数据绑定与 View 进行通信。但是如何在 ViewModel 中创建 UIElements for View。

谢谢。

【问题讨论】:

    标签: wpf mvvm view viewmodel


    【解决方案1】:

    ViewModel 不应直接创建任何 UIElement,因为 ViewModel 不应依赖于 View。 ViewModel 提供 View(即 UIElements)可以绑定的数据。

    如果您的问题是针对如何引导视图,有两种方法:视图优先和视图模型优先。在前者中,您首先创建 View,然后创建并绑定 ViewModel。在后者中,您让 ViewModel 创建 View(通过接口)。阅读更多关于它的信息here

    如果您的问题是针对组成 UIElements 的视图,这是通过 DataBinding 以及使用 DataTemplates 和 ControlTemplates 来完成的。

    【讨论】:

    • 我真的更喜欢 View(例如在 App.xaml 中)创建第一个 ViewModel 的方法,因为这样可以使所有引用直接从 View 指向“较低”级别的代码。
    • 正确使用 DIP 时 ViewModel-first 也是如此。我更喜欢 ViewModel-fist,因为 UI 的流程通常由业务规则驱动。
    【解决方案2】:

    MVVM 是一种松散的设计模式,只要纯粹只关注 UI,将代码放在代码后面是可以接受的,但请记住,它可能更难进行单元测试。

    严格来说,ViewModel 不与 View 通信,ViewModel 中没有对 View 的引用,而是 View 从 ViewModel 读取数据并在 ViewModel 上执行命令。

    【讨论】:

      【解决方案3】:

      问题是我看到的动态组件创建需求。

      您可以将 Container 对象放在视图上,然后在 modelView 上创建 UIElements 并将此 UIElement 集合绑定到 Container 的 Content 属性。但我认为这不是一个好习惯。这种方法打破了模型和视图的分离。所以你需要避免动态组件的创建。

      MVVM 方法有点不同。有时强迫我们使用技巧。即不是使用 ListBox 的 MemberPath 属性,而是定义一个 ItemTemplate 并将 ButtonBase 元素放在模板上以支持命令!或者你扩展 ListBox 并支持命令。

      我的提议而不是动态对象创建。使用 DataTemplates 并更改 ModelView 上的绑定成员,然后将自动为您创建视图。对于复杂的 senario 可能很难。我们这样做都是为了保持 MVVM 结构。

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 2011-01-11
        • 2010-11-17
        • 2010-12-07
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 2021-06-09
        相关资源
        最近更新 更多