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
属性所做的任何修改,一切都应按预期工作。非常感谢。效果很好,原因和解决方案都很清楚。