所以在经典的MVVM示例中,我看到DataTemplate定义用于将View Models映射到Views,在MVVM Light框架中执行此操作的标准方法是什么,以及映射应该放在何处?以下是我现在正在做的事情和我正在谈论的内容的例子,可混合性对我来说很重要!
主窗口:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="STS2Editor.MainWindow"
Title="{Binding ApplicationTitle, Mode=OneWay}"
DataContext="{Binding RootViewModel, Source={StaticResource Locator}}">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/ApplicationSkin.xaml" />
<ResourceDictionary Source="Resources/ViewMappings.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding ApplicationManagementViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>
</Window>
在上面的代码中,我的RootViewModel类有一个ApplicationManagementViewModel类的实例,它具有相同的属性名:
public ApplicationManagementViewModel ApplicationManagementViewModel {get {...} set {...} }
我引用ResourceDictionary“ViewMappings.xaml”来指定我的视图模型如何表示为视图。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:STS2Editor.ViewModel">
<DataTemplate DataType="{x:Type local:ApplicationManagementViewModel}">
<local:ApplicationManagementView/>
</DataTemplate>
</ResourceDictionary>
我应该使用ViewModelLocator做这样的事情吗?那些视图模型的集合呢?
答案 0 :(得分:4)
您使用的方法(使用隐式类型的DataTemplates)在WPF中正常工作,但不幸的是它在Silverlight中不起作用。这就是为什么我更喜欢使用一种在两个世界都有效的更明确的方法的原因之一。
此外,隐式输入的DataTemplates可能有点令人困惑,因为模板的来源并不总是很清楚。这有时会使集成商的工作变得非常困难,特别是对UI的小改动(在那里,做到了:)
没有义务在MVVM Light中使用ViewModelLocator,它只是一种运行良好且易于理解的方式(对于阅读不熟悉WPF / SL细微之处的代码的人来说)。最后,这是一个偏好问题,但最近ViewModelLocator模式似乎越来越受欢迎(参见例如这篇文章,其中一般的ViewModelLocator与MEF一起使用)。
http://www.johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum/
最后,让我补充一点,我对MVVM Light中ViewModelLocator的当前实现不是很满意,我想在下一个版本中提出一个更通用的解决方案。