将视图模型连接到视图的首选方法是什么?

时间:2011-03-28 16:50:59

标签: wpf mvvm viewmodel datatemplate viewmodellocator

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

连接Views和ViewModel的最佳做法是什么?

2 个答案:

答案 0 :(得分:6)

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

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

这样做的好处是可以更直观地进行设计,尤其是在使用Blend时。

另一种方法是使用“ViewModel-First”。这样,您生成ViewModel,然后使用DataTemplates来填充View。 ViewModels将组成/创建其他VM,直接设置相应的Model。从程序员的角度来看,这通常是(IMO)更加清晰,因为事情只是直接起作用。然而,从设计者的角度来看,设计和使用通常更加困难,因为设计时数据更难以生成等。

这两种方法都是完全有效的,并且具有很强的优点和缺点。由于各种原因,不同的MVVM纯粹主义者倾向于选择一种方法而不是另一种方法 - 通常是从代码清洁度的角度或从设计者的角度来看它们是否接近这种方法。

答案 1 :(得分:1)

我看待它的方式:

  1. 所有ViewModel都有一个不错的位置。
  2. MVVMLight提供了一个很好的清理机制。
  3. 您可以静态地在标记中连接ViewModel。 ---如果你没有意识到你的ViewModel被实例化并且只要你创建了一个UI实例就设置为DataContext,那么这有时会成为一个问题。
  4. 对于(3)(如何使用ViewModelLocator):

    1. 确保安装了代码段。
    2. 打开ViewModelLocator.cs并输入mvvmlocatorproperty。在intellisense中选择它并双重TAB以使代码段起作用。将其更改为适当的属性。
    3. 在您的xaml中,您将使用它:

      <Window.DataContext>
          <Binding Path="HomePage" Source="{StaticResource Locator}"/>
      </Window.DataContext>
      
    4. 对于这个属性:

          public HomePageViewModel HomePage
          {
              get
              {
                  return HomePageStatic;
              }
          }
      
相关问题