使用绑定更改网格中的usercontrol

时间:2015-04-16 15:49:36

标签: c# wpf mvvm user-controls

我正在创建一个WPF应用程序,它有一个主屏幕,其中加载了其他屏幕。

主屏幕可以看作是页眉/页脚模板,根据我当时需要显示的内容来替换中心部分。 (这是一个3行网格,其中usercontrol应放在第1行)。这有一个viewmodel正在改变页眉/页脚状态。

我已将这些更改部分(第1行)实现为usercontrols。

现在我想知道是否有任何方法可以使用绑定(对某些东西......)以便我可以更改加载的usercontrol而不是从我现在正在执行的代码后面执行此操作。

如果这完全违背MVVM原则,请告诉我如何处理这个问题。

谢谢!

1 个答案:

答案 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)紧密耦合在一起。