过去在使用MVVM时,我已经将每个View创建为DataTemplate
到它的相应viewmodel来处理连接它们。我刚开始使用MVVM Light,发现他们有ViewModelLocator
。我看过的其他几个工具包包含了一些变体,但是使用DataTemplate
会带来什么好处?
连接Views和ViewModel的最佳做法是什么?
答案 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)
我看待它的方式:
DataContext
,那么这有时会成为一个问题。对于(3)(如何使用ViewModelLocator):
ViewModelLocator.cs
并输入mvvmlocatorproperty
。在intellisense中选择它并双重TAB以使代码段起作用。将其更改为适当的属性。在您的xaml中,您将使用它:
<Window.DataContext>
<Binding Path="HomePage" Source="{StaticResource Locator}"/>
</Window.DataContext>
对于这个属性:
public HomePageViewModel HomePage
{
get
{
return HomePageStatic;
}
}