目前我有一些使用类似以下代码链接到ViewModels的视图:
<Application.Resources>
<DataTemplate DataType="{ x:Type vm:AgeIndicatorViewModel}">
<v:AgeIndicatorView />
</DataTemplate>
</Application.Resources>
我有两个问题:
这种方法是否允许我只将一个视图链接到每个视图模型(我认为它确实会对我造成这种限制,但我想确定)
使用此方法时,我应该在哪里放置所有DataTemplate声明?目前只有少数几个,而且它们都在App.Xaml中 - 是否有更好的位置,或App.Xaml罚款/最佳位置?
最重要的问题是第二个问题,因为我希望以这种方式将我的ViewModel链接到我的View,因为它不需要外部库等。
我的ViewModel的设置方式,其属性和命令等都已经完成。
答案 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。