如何将DataTemplate与持久性ViewModel一起使用

时间:2014-01-26 22:27:22

标签: wpf mvvm datatemplate datacontext contentcontrol

我开始将ContentControls绑定到存储在我的ViewModels中的视图,虽然它按预期工作,但它打破了我一直试图遵循的MVVM模式。它感觉很脏。因此,根据聊天中某人的推荐,我了解了DataTemplates,实现了它,这是一个非常棒的解决方案。然而,我遇到了一个障碍,很可能是我的知识限制,所以我在这里并提前感谢。

前提

我的问题描述是基于我收集的关于使用DataTemplates的内容,所以如果我的前提是错误的,那么如果你在评论中打我,那么我会更好理解(如果他们发现这个问题也是如此)。

ContentControl的Content属性绑定到ViewModel中的属性,其类型指的是可能需要的任何ViewModel实现的某个接口。 每当该属性设置为相应的ViewModel时,ContentControl会查看DataTemplate以确定要加载的View,然后初始化相应的视图,然后View初始化自己的ViewModel 。最后一句话非常关键,所以如果我错了,我的理解就会消失,我的问题的本质不是我认为的。以下是UserControl中包含DataTemplate

的代码段
<UserControl.DataContext>
    <viewModels:ControlCenterVM />
</UserControl.DataContext>
<UserControl.Resources>
    <DataTemplate DataType="{x:Type moduleViewModels:StateVM}">
        <moduleViews:StateView/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type moduleViewModels:InputVM}">
        <moduleViews:InputView/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type moduleViewModels:TemperatureVM}">
        <moduleViews:TemperatureView/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type moduleViewModels:NetworkControlVM}">
        <moduleViews:NetworkControlView />
    </DataTemplate>
</UserControl.Resources>

<ContentControl Content="{Binding LeftModule}" />

问题

加载的View会创建一个新的ViewModel。我应该使用的ViewModel实际上与我设置到绑定到ContentControl的属性的确切相同,但在我看来它只使用它来为{{1}进行类型匹配}} 抬头。这是对的吗?

查看我在上面提供的代码段的View部分。我的所有DataContext,尤其是那些“可以”加载到Views 中的人,都会像这样创建他们的ContentControl。如何在这些区域中引用静态DataContext

再次感谢。

1 个答案:

答案 0 :(得分:1)

  

每当将属性设置为适当的ViewModel时,   ContentControl查看DataTemplate以确定要查看的View   加载然后初始化相应的View 然后初始化该View   初始化它自己的ViewModel

除了我突出显示的最后一部分之外,你说得对。

Content设置ContentControl属性会有效地为其显示的视图设置DataContext这意味着您无需从视图中明确设置ViewModel

只需删除您在视图中对DataContext属性所做的任何修改,一切都应按预期工作。