使用绑定更改网格中的用户控件

Use binding to change usercontrol in a grid

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

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

我已经将那些变化的部分(第 1 行)实现为用户控件。

现在我想知道是否有任何方法可以使用绑定(绑定到某物..)以便我可以更改加载的 usercontrol 而不是像我现在正在做的那样从后面的代码中进行。

如果这完全违背了 MVVM 原则,请提示我应该如何处理。

谢谢!!

我觉得您应该考虑使用 WPF 的数据模板。

根据你的问题举这个例子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 的 属性。在您的视图模型中,您可以将 MainContent 设置为您的用户控件的视图模型。

ContentPresenter 将尝试显示它绑定到的任何对象。在此示例中,我创建了一个将特定对象类型(例如 UserControlViewModel)映射到视图(例如 UserControlView)的 DataTemplate。

您可以定义多个数据模板,以允许您的内容呈现器处理多个视图模型(或任何类型的对象):

<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 属性。那里不需要 DataTemplate,因为 ContentPresenter 知道如何呈现 UserControl。但是,这与 MVVM 背道而驰,因为您将 UI (XAML) 与您的代码 (viewmodel) 紧密耦合。