对于使用MVVM模式的WPF应用程序,使用DataTemplate将视图链接到ViewModel

对于使用MVVM模式的WPF应用程序,使用DataTemplate将视图链接到ViewModel,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,当前我有一些视图链接到ViewModels,使用类似于以下代码: <Application.Resources> <DataTemplate DataType="{ x:Type vm:AgeIndicatorViewModel}"> <v:AgeIndicatorView /> </DataTemplate> </Application.Resources> 关于这一点,我有两个问题:

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

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

关于这一点,我有两个问题:

  • 这种方法是否允许我只将一个视图链接到每个视图模型(我认为它确实改善了我的这种限制,但我想确定一下)

  • 使用此方法时,应将所有DataTemplate声明放在何处?目前只有几个,它们都在App.Xaml中-有更好的位置吗,或者App.Xaml很好/最好的位置吗

最重要的问题是第二个问题,因为目前我想以这种方式将我的ViewModel链接到我的视图,因为它不需要外部库等

我的ViewModels的设置方式,以及它们的属性和命令等都已经开始工作了

这种方法是否允许我只将一个视图链接到每个视图模型(我认为它确实改善了我的这种限制,但我想确定一下)

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

使用此方法时,应将所有DataTemplate声明放在何处?目前只有几个,它们都在App.Xaml中-有更好的位置吗,或者App.Xaml很好/最好的位置吗

Xaml很好,或者说在视觉层次结构的任何地方都可以使用DataTemplate


这就是说,如果项目成为一个非常大规模的项目,那么最好开始使用-这允许您在定义视图/视图模型对的“附近”设置资源字典,然后在更高级别上使用它们(即:将它们合并到App.Xaml中).

像您在问题中那样指定隐式数据模板会将视图模型绑定到单个视图。但是,您可以在任何控制级别覆盖此选项,因此您可以:

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

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

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

一般来说,应用程序资源是定义这些资源的最佳位置。因为如果您有多个窗口(即Window1和Window2),那么视图模型将始终拾取隐式数据模板