定义嵌套视图的标准约定是什么:MVVM Light中的viewmodel映射

Fir*_*oso 5 wpf mvvm mvvm-light blendability

所以在经典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>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我的RootViewModel类有一个ApplicationManagementViewModel类的实例,它具有相同的属性名:

public ApplicationManagementViewModel ApplicationManagementViewModel {get {...} set {...} }
Run Code Online (Sandbox Code Playgroud)

我引用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>
Run Code Online (Sandbox Code Playgroud)

我应该使用ViewModelLocator做这样的事情吗?那些视图模型的集合呢?

LBu*_*ion 4

您使用的方法(使用隐式类型的 DataTemplates)在 WPF 中工作正常,但不幸的是它在 Silverlight 中不起作用。这就是为什么我更喜欢使用一种在两个领域都有效的更明确的方法的原因之一。

此外,隐式类型的 DataTemplate 可能会有点令人困惑,因为模板的来源并不总是很清楚。这有时会使集成商的工作变得非常困难,特别是对于 UI 的微小更改(曾经在那里,完成过:)

在 MVVM Light 中没有必要使用 ViewModelLocator,它只是一种运行良好且非常容易理解的方式(对于不熟悉 WPF/SL 微妙之处的阅读代码的人来说)。最后,这在很大程度上是一个偏好问题,但最近 ViewModelLocator 模式似乎越来越受欢迎(例如,请参阅这篇文章,其中通用 ViewModelLocator 与 MEF 一起使用)。

http://www.johnpapa.net/simple-viewmodel-locator-for-mvvm-the-病人-have-left-the-asylum/

最后,我要补充一点,我对 MVVM Light 中 ViewModelLocator 目前的实现不是很满意,我想在下一个版本中提出一个更通用的解决方案。