3

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

连接视图和视图模型的最佳实践是什么?

4

2 回答 2

6

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

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

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

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

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

于 2011-03-28T16:57:07.807 回答
1

我的看法:

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

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

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

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

对于此属性:

    public HomePageViewModel HomePage
    {
        get
        {
            return HomePageStatic;
        }
    }
于 2011-03-28T16:56:24.240 回答