2011-03-28 44 views
3

在使用MVVM过去,我已经创建了每个视图作为DataTemplate它是相应的viewmodel来处理连接它们。我刚开始使用MVVM Light,并注意到他们有ViewModelLocator。我看过的其他几个工具包包含了一些变化,但是这会带来怎样的好处?DataTemplate将视图模型连接到视图的首选方法是什么?

这是连接您的视图和ViewModels的最佳做法?

+0

我刚刚回答了这个问题[here](http://stackoverflow.com/questions/5462040/what-is-a-viewmodellocator-and-what-are-its-pros-cons-compared-to-datatemplates) :) – Jon 2011-03-28 16:57:01

回答

6

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

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

这样做的好处是可以更容易地进行视觉设计,特别是在使用Blend时。

另一种方法是使用“ViewModel-First”。由此,您生成您的ViewModels,然后使用DataTemplates来填充视图。 ViewModels将编写/创建其他虚拟机,直接设置适当的模型。从程序员的角度来看,这通常是(IMO)多得多,因为事情直接起作用。然而,从设计师的角度来看,设计和工作通常更加困难,因为设计时数据更难生成等等。

这两种方法都是完全有效的,并且具有强大的优点和缺点。不同的MVVM纯粹主义者倾向于更喜欢一种方法,出于各种各样的原因 - 通常他们是从代码清洁度角度还是从设计者的角度来看待这个问题。

+0

+1:很好的总结。 – Jon 2011-03-28 16:58:41

+0

+1直接回答。我相信ViewModelLocator是最好的选择(称我为纯粹主义者A和纯粹主义者B)。有了它,你可以在你的XAML中发送你的datacontext,它允许你绑定你的控件的属性 - 当你在你的ViewModel中设置你的datacontext时,这比猜测更容易。 – SQLMason 2011-03-31 20:00:30

1

我看到它的方式:

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

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

  1. 确保你已经安装了片段。
  2. 打开ViewModelLocator.cs和类型mvvmlocatorproperty。在intellisense中选择它,然后双击Tab以使片段工作。将其更改为适当的属性。
  3. 在XAML中,你会使用这样的:

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

对于此属性:

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