似乎是一项微不足道的任务:我正在使用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”变量并且“调用属性已更改”..
答案 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部分。如果您希望显示许多用户控件/视图,或者您正在重复使用多个视图,或者您打算实际动态生成视图(而不仅仅是加载现有用户控件),那么这可能满足您的需求。