过去在使用 MVVM 时,我创建了每个视图作为DataTemplate
它对应的视图模型来处理它们的连接。我刚开始使用 MVVM Light,并注意到他们有ViewModelLocator
. 我看过的其他几个工具包包括一些变体,但是这带来了什么好处DataTemplate
呢?
连接视图和视图模型的最佳实践是什么?
过去在使用 MVVM 时,我创建了每个视图作为DataTemplate
它对应的视图模型来处理它们的连接。我刚开始使用 MVVM Light,并注意到他们有ViewModelLocator
. 我看过的其他几个工具包包括一些变体,但是这带来了什么好处DataTemplate
呢?
连接视图和视图模型的最佳实践是什么?
有两种不同的方法,而不是一种“正确的方法”。
一个ViewModelLocator
或类似的帮助方法是开发 MVVM 的“视图优先”方法。这意味着您从设计器中的 View 开始,然后构建 ViewModel 以匹配。从逻辑上讲,视图通常会创建其他视图,并且 ViewModel 通常通过某种形式的定位器加载并为给定视图填充。消息或服务用于将适当的模型挂接到新生成的 ViewModel 中。
这样做的好处是视觉设计更容易一些,尤其是在使用 Blend 时。
另一种方法是工作“ViewModel-First”。通过这种方式,您可以生成 ViewModel,然后使用 DataTemplates 来填充 View。ViewModels 将组合/创建其他 VM,直接设置适当的模型。从程序员的角度来看,这通常(IMO)要干净得多,因为事情只是直接工作。但是,从设计师的角度来看,设计和使用通常更困难,因为设计时数据更难生成等。
这两种方法都是完全有效的,并且有很强的优点和缺点。出于各种原因,不同的 MVVM 纯粹主义者倾向于选择一种方法而不是另一种方法——通常是从代码清洁度的角度还是从设计人员的角度来看。
我的看法:
DataContext
创建 UI 实例后立即被实例化并设置为 ,这有时可能会成为问题。对于(3)(如何使用 ViewModelLocator):
ViewModelLocator.cs
并输入mvvmlocatorproperty
。在智能感知和双 TAB 中选择它以使代码段起作用。将其更改为适当的属性。在您的 xaml 中,您将像这样使用它:
<Window.DataContext>
<Binding Path="HomePage" Source="{StaticResource Locator}"/>
</Window.DataContext>
对于此属性:
public HomePageViewModel HomePage
{
get
{
return HomePageStatic;
}
}