Wpf 如何使用带有持久ViewModel的DataTemplate

Wpf 如何使用带有持久ViewModel的DataTemplate,wpf,mvvm,datatemplate,datacontext,contentcontrol,Wpf,Mvvm,Datatemplate,Datacontext,Contentcontrol,我开始将ContentControls绑定到存储在我的ViewModels中的视图,虽然它按预期工作,但它打破了我一直尝试遵循的MVVM模式。只是感觉脏了。因此,根据聊天室中某个人的推荐,我了解了DataTemplates,并实现了它,这是一个非常棒的解决方案。然而,我遇到了一个障碍,很可能是我的知识有限,所以我在这里,并提前表示感谢 前提 对我的问题的描述是基于我收集到的关于使用数据模板的信息,因此,如果我的前提是错误的,那么如果你能在评论中给我打电话,这样我就可以更好地理解我的问题(如果其他

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

前提 对我的问题的描述是基于我收集到的关于使用
数据模板的信息,因此,如果我的前提是错误的,那么如果你能在评论中给我打电话,这样我就可以更好地理解我的问题(如果其他人发现这个问题,他们也可以这样做)

ContentControl
的Content属性绑定到
ViewModel
中的属性,该属性的类型引用可能需要的任何
ViewModel
实现的某个接口每当属性设置为适当的
ViewModel
时,
ContentControl
查看
DataTemplate
以确定要加载哪个
视图
,然后它初始化相应的视图,然后
视图
初始化它自己的
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}" />

问题 加载的
视图
将创建一个新的
视图模型
。我应该使用的
ViewModel
实际上与我设置为绑定到
ContentControl
的属性的视图模型完全相同,但在我看来,它似乎只用于对
视图进行类型匹配。这是正确的吗

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

再次感谢

只要将属性设置为适当的ViewModel,则 ContentControl查看DataTemplate以确定要查看的视图 加载,然后初始化相应的视图,然后初始化该视图 初始化它自己的视图模型

除了我强调的最后一部分,你对所有事情都是对的

ContentControl
设置
Content
属性可以有效地为其显示的视图设置
DataContext
这意味着您不必从视图中显式设置
ViewModel


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

非常感谢。效果很好,原因和解决方案都很清楚。