我开始将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
?
再次感谢。
答案 0 :(得分:1)
每当将属性设置为适当的ViewModel时, ContentControl查看DataTemplate以确定要查看的View 加载然后初始化相应的View 然后初始化该View 初始化它自己的ViewModel 。
除了我突出显示的最后一部分之外,你说得对。
为Content
设置ContentControl
属性会有效地为其显示的视图设置DataContext
。 这意味着您无需从视图中明确设置ViewModel
。
只需删除您在视图中对DataContext
属性所做的任何修改,一切都应按预期工作。