【问题标题】:WPF and MVVM: bind UserControl to XAML dynamicallyWPF 和 MVVM:将 UserControl 动态绑定到 XAML
【发布时间】:2014-06-25 14:13:16
【问题描述】:

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

假设我有 2 个用户控件,一个带有按钮,另一个带有标签。 在主视图中,我有一个容器。遵循 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>

并使用用户控件为按钮或标签从命令中输入它:尽管“MyControl”变量已设置并且“调用属性已更改”,但什么也没有发生。..

【问题讨论】:

  • MVVMLight Using Two Views 通读一遍。它解释了基本概念。之后将其应用于您的案例应该很简单。顺便说一句,不确定model view 是什么意思。你的意思是ViewModel?如果是这样,您首先不会在 VM 中拥有 UI 元素。通读链接的文章,可能还有以前的文章以提供帮助
  • 请参阅我对Navigating through multiple child views contained in Main Window 问题的回答。虽然它与您的示例不完全相同,但您仍然应该能够按照那里的建议来满足您的要求。
  • @Sheridan +1 我正要链接到你的答案...
  • 谢谢,我的朋友。我打算把这个问题作为那个问题的副本来结束,但你知道这些用户是什么样的......它与我的问题不完全相同......
  • @Netscape,是的,我们不应该在视图模型中有任何与 UI 相关的类,但这实际上取决于您的应用程序的专业程度。如果你有一个专业的应用程序,那么你可能有一套单元测试,然后在视图模型中有 UI 元素会导致问题。但是,如果您只是粗略地遵循 MVVM 方法,因为它只是让使用 WPF 更容易而且它不是一个大型应用程序,那么它真的 无关紧要。这有点像将您的数据访问类放在一个单独的项目中......只有在专业应用程序中才真正需要。

标签: c# wpf xaml mvvm user-controls


【解决方案1】:

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

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

对于您的示例,我会将 ItemsControl 更改为 ContentControl 并将内容绑定到您的 MyControl 属性。这应该可以工作。

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

但是,我强烈建议您研究其他方法 - 在您的 VM 中进行控制会破坏 MVVM。根据您在做什么查看数据模板 - cmets 中的@Sheridan 链接提供了一个很好的方法描述。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多