使用DataTemplate将View与ViewModel链接到使用MVVM模式的WPF应用程序

时间:2011-07-21 23:31:22

标签: wpf xaml mvvm

目前我有一些使用类似以下代码链接到ViewModels的视图:

<Application.Resources>
        <DataTemplate DataType="{ x:Type vm:AgeIndicatorViewModel}">
        <v:AgeIndicatorView />
    </DataTemplate>
</Application.Resources>

我有两个问题:

  • 这种方法是否允许我只将一个视图链接到每个视图模型(我认为它确实会对我造成这种限制,但我想确定)

  • 使用此方法时,我应该在哪里放置所有DataTemplate声明?目前只有少数几个,而且它们都在App.Xaml中 - 是否有更好的位置,或App.Xaml罚款/最佳位置?

最重要的问题是第二个问题,因为我希望以这种方式将我的ViewModel链接到我的View,因为它不需要外部库等。

我的ViewModel的设置方式,其属性和命令等都已经完成。

2 个答案:

答案 0 :(得分:2)

  

这种方法是否允许我只将一个视图链接到每个视图模型(我认为它确实会对我造成这种限制,但我想确定)

是。如果您尝试将多个ViewModel链接到多个视图,则需要将它们封装在单独的VM中,并添加新的DataTemplate。

  

使用此方法时,我应该在哪里放置所有DataTemplate声明?目前只有少数,而且它们都在App.Xaml中 - 是否有更好的位置,或App.Xaml罚款/最佳位置?

App.Xaml很好,或者实际上在使用DataTemplate的视觉层次结构中的任何位置。

话虽如此,如果项目变成一个非常大规模的项目,开始使用Merged Resource Dictionaries通常更好 - 这允许您在定义View / ViewModel对的地方设置资源字典,但是然后在更高级别使用它们(即:将它们合并到App.Xaml中)。

答案 1 :(得分:2)

像在问题中一样指定隐式DataTemplate会将View-Model绑定到单个View。你可以在任何控制级别覆盖它,所以你可以:

<Window.Resources>
    <DataTemplate DataType="{x:Type vm:AgeIndicatorViewModel}">
        <v:AgeIndicatorView2 />
    </DataTemplate>
</Window.Resources>

这将更改应用于给定窗口的视图模型的视图。这可以在任何级别的任何控件上完成。

在应用程序级别执行此操作的好处是,它应用于应用程序中的所有窗口。虽然我上面的例子只适用于一个窗口。

通常,应用资源是定义这些资源的最佳位置。因为如果您有多个Windows(即Window1和Window2),那么您的视图模型将始终选择隐式DataTemplate。