WPF和MVVM:动态地将UserControl绑定到XAML

时间:2014-06-25 14:13:17

标签: c# wpf xaml mvvm user-controls

似乎是一项微不足道的任务:我正在使用MVVM模式构建一个wpf应用程序。我想要的是动态地改变视图的一部分,使用不同的UserControls,取决于用户输入。

让我们说,我有2个UserControl,一个带按钮,另一个有标签。 在主视图中我有一个容器。以下XAML“工作”:

<GroupBox Header="container" >
    <local:UserControlButton />
</GroupBox>

并弹出一个带按钮的UserControl元素。如果我把它改成另一个,它也有效。 问题是如何动态地提供该组箱。如果我在模型视图中添加类似的东西:

private UserControl _myControl;
public UserControl MyControl
{
    get
    {
        return _myControl;
    }
    set
    {
        _myControl= value;
        InvokePropertyChanged("MyControl");
    }
}

并将我的视图XAML更改为:

<GroupBox Header="container" >
    <ItemsControl ItemsSource="{Binding MyControl}" />
</GroupBox>

并使用usercontrol为命令提供按钮或标签:没有任何反应,虽然设置了“MyControl”变量并且“调用属性已更改”..

2 个答案:

答案 0 :(得分:1)

显然有很多方法可以为这个特定的猫设置皮肤 - 但要回答为什么它不起作用的问题,你需要在MSDN上查看ItemsControl的ItemsSource属性。

项目控件旨在显示通过传递给ItemsSource属性的IEnumerable提供的多个项目。您正在传递UserControl,因此绑定将失败。

对于您的示例,我将ItemsControl更改为ContentControl并将内容绑定到您的MyControl属性。这应该有效。

<GroupBox Header="container" >
    <ContentControl Content="{Binding MyControl}" />
</GroupBox>

但是,我强烈建议您研究其他方法 - 在VM中控制MVVM会让我心烦意乱。根据您正在做的事情,查看数据模板 - @ Sheridan在评论中的链接提供了一种很好的描述方式。

答案 1 :(得分:0)

无法将此作为评论发布,因此添加为答案..

看看这个: Implementing an own "Factory" for reusing Views in WPF

它使用DataTemplates但不需要每个视图的DataTemplate部分。如果您希望显示许多用户控件/视图,或者您正在重复使用多个视图,或者您打算实际动态生成视图(而不仅仅是加载现有用户控件),那么这可能满足您的需求。