我正在创建一个WPF应用程序,它有一个主屏幕,其中加载了其他屏幕。
主屏幕可以看作是页眉/页脚模板,根据我当时需要显示的内容来替换中心部分。 (这是一个3行网格,其中usercontrol
应放在第1行)。这有一个viewmodel
正在改变页眉/页脚状态。
我已将这些更改部分(第1行)实现为usercontrols。
现在我想知道是否有任何方法可以使用绑定(对某些东西......)以便我可以更改加载的usercontrol
而不是从我现在正在执行的代码后面执行此操作。
如果这完全违背MVVM原则,请告诉我如何处理这个问题。
谢谢!
答案 0 :(得分:1)
听起来我应该看看使用WPF的DataTemplates。
根据您的问题采取此示例XAML:
<Grid>
... XAML for your Header and Footer
<ContentPresenter Content="{Binding MainContent">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}">
<view:UserControlView>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
我在这里使用ContentPresenter充当您内容的占位符。这绑定到主视图模型上名为MainContent
的属性。在viewmodel中,您可以将MainContent设置为usercontrol的viewmodel。
ContentPresenter
将尝试显示绑定的任何对象。在这个例子中,我创建了一个DataTemplate,它将特定的对象类型(例如UserControlViewModel)映射到一个视图(例如UserControlView)。
您可以定义多个DataTemplates,以允许您的内容呈现器处理多个视图模型(或任何类型的对象):
<Grid>
... XAML for your Header and Footer
<ContentPresenter Content="{Binding MainContent">
<ContentPresenter.Resources>
<DataTemplate DataType="{x:Type viewmodel:UserControlViewModel}">
<view:UserControlView>
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodel:AnotherUserControlViewModel}">
<view:AnotherUserControlView>
</DataTemplate>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
我希望指出你正确的方向。
您可以在MSDN上找到有关数据模板的更多信息:
https://msdn.microsoft.com/en-us/library/ms742521(v=vs.110).aspx
编辑:值得一提的是,可能只是在主视图模型中新建了UserControl.xaml,并将其设置为MainContent属性。由于ContentPresenter知道如何呈现UserControl,因此不需要DataTemplate。但是,这与MVVM相反,因为您将UI(XAML)与代码(viewmodel)紧密耦合在一起。