【问题标题】:What is the preferred way to connect viewmodels to their views?将视图模型连接到其视图的首选方式是什么?
【发布时间】:2011-07-24 15:45:11
【问题描述】:

过去在使用 MVVM 时,我将每个视图创建为 DataTemplate 到它对应的视图模型以处理连接它们。我刚开始使用 MVVM Light,发现他们有 ViewModelLocator。我看过的其他几个工具包也包含了一些变体,但是使用DataTemplate 带来了什么好处?

连接视图和视图模型的最佳做法是什么?

【问题讨论】:

  • 我刚刚回答了这个问题here :)

标签: wpf mvvm viewmodel datatemplate viewmodellocator


【解决方案1】:

我的看法:

  1. 您为所有 ViewModel 提供了一个好地方。
  2. MVVMLight 提供了一个很好的清理机制。
  3. 您可以在标记中静态连接 ViewModel。 --- 如果您没有意识到您的 ViewModel 在创建 UI 实例后立即被实例化并设置为 DataContext,这有时可能会成为问题。

对于(3)(如何使用ViewModelLocator):

  1. 确保您已安装 sn-ps。
  2. 打开ViewModelLocator.cs 并输入mvvmlocatorproperty。在智能感知中选择它并使用双 TAB 以使 sn-p 工作。将其更改为适当的属性。
  3. 在您的 xaml 中,您将像这样使用它:

    <Window.DataContext>
        <Binding Path="HomePage" Source="{StaticResource Locator}"/>
    </Window.DataContext>
    

对于这个属性:

    public HomePageViewModel HomePage
    {
        get
        {
            return HomePageStatic;
        }
    }

【讨论】:

    【解决方案2】:

    有两种不同的方法,而不是一种“正确的方法”。

    ViewModelLocator 或类似帮助的方法是开发 MVVM 的“视图优先”方法。这意味着您从设计器中的 View 开始,然后构建 ViewModel 以匹配。从逻辑上讲,视图通常会创建其他视图,并且 ViewModel 通常通过某种形式的定位器加载并为给定视图填充。消息或服务用于将适当的模型挂接到新生成的 ViewModel 中。

    这样做的好处是视觉设计更容易一些,尤其是在使用 Blend 时。

    另一种方法是“ViewModel-First”工作。通过这种方式,您可以生成 ViewModel,然后使用 DataTemplates 来填充 View。 ViewModels 将组合/创建其他 VM,直接设置适当的模型。从程序员的角度来看,这通常(IMO)要干净得多,因为事情只是直接工作。但是,从设计师的角度来看,设计和使用通常更困难,因为设计时数据更难生成等等。

    这两种方法都完全有效,并且各有优缺点。出于各种原因,不同的 MVVM 纯粹主义者倾向于选择一种方法而不是另一种方法 - 通常是从代码清洁度的角度还是设计人员的角度来处理。

    【讨论】:

    • +1 直接回答。我相信 ViewModelLocator 是要走的路(叫我纯粹主义者 A vs 纯粹主义者 B)。有了它,您可以在 XAML 中发送数据上下文,这允许您通过控件的属性进行绑定 - 这比在 ViewModel 中设置数据上下文时更容易猜测。
    猜你喜欢
    • 2011-05-12
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多