【问题标题】:Use binding to change usercontrol in a grid使用绑定更改网格中的用户控件
【发布时间】:2015-04-17 02:14:21
【问题描述】:

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

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

我已将这些更改部分(第 1 行)实现为用户控件。

现在我想知道是否有任何方法可以使用绑定(到某些东西..),这样我就可以更改加载的 usercontrol 而不是像我现在那样从后面的代码中执行它。

如果这完全违反了 MVVM 原则,请给我一些提示,告诉我应该如何处理。

谢谢!!

【问题讨论】:

    标签: c# wpf mvvm user-controls


    【解决方案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 的属性。在您的视图模型中,您可以将 MainContent 设置为您的用户控件的视图模型。

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

    您可以定义多个 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) 紧密耦合。

    【讨论】:

    • 您的最后一点就是我现在正在使用的内容。我设计了一种使用DialogHelper 实例化CustomDialogView : Window 的方法。该对话框窗口的内容可以是任意 3 个(或更多)UserControls 之一。因此,与其在 ViewModel 中对用户控件进行排队(就像我现在所做的那样),我可以使用一个字符串并将所有用户控件放在 Window.Resources 中。听起来怎么样?我只是想弄清楚该怎么做。
    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2011-02-03
    • 2014-09-05
    • 2020-06-17
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多