wpf - (WPF MVVM)如何将用户控件从 ViewModel 中的集合添加到 View

标签 wpf xaml mvvm user-controls view

我想知道如何将用户控件从集合中添加到窗口中。目前,我正在将 Views 文件夹中的控件添加到像这样的网格单元格中。

<views:MyControl Grid.Column="0" Grid.Row="0" Margin="10"/>

我的 View 模型中有一个 ObservableCollection,它存储了一组用户控件。在我看来,我想从该集合中获取一个控件并将其放入网格的单元格中。如何像上面所做的那样将控件添加到网格中,但是从我的集合中?

例如,类似于 {Binding Path controls.[1] 的东西

最佳答案

如果某物包含一组用户控件,则它不是 View 模型。

支持显示其他控件的 View 的 View 模型应该包含这些控件的 View 模型的集合。你应该绑定(bind)ItemsSourceItemsControl到集合属性,然后使用模板匹配和数据模板来创建控件。

因此,假设您要显示 FooView 的集合。和 BarView窗口中的用户控件。您将创建一个 FooViewModel类和 BarViewModel类,然后为资源字典中的每个创建一个数据模板,例如:

<Window.Resources>
   <DataTemplate x:Key="{Type local:FooViewModel}">
      <local:FooView />
   </DataTemplate>
   <DataTemplate x:Key="{Type local:BarViewModel}">
      <local:BarView />
   </DataTemplate>
</WindowResources>

完成此操作后,任何 ItemsControl谁的ItemsSource绑定(bind)到这些 View 模型的集合将找到模板,创建控件,并将它们绑定(bind)到 View 模型。

如果 ItemsControl您使用的是 Grid ,您可能还有一个额外的步骤。任意 ItemsControl生成一个项目容器(在 Grid 的情况下,它是一个 ContentPresenter )来保存它正在显示的 View ;在 Grid ,您可能需要分配 Grid.RowGrid.Column到那个容器。假设您的 View 模型有 RowColumn属性,这样做的方法是:
<Grid.ItemContainerStyle>
   <Style TargetType="ContentPresenter">
      <Setter Property="Grid.Row" Value="{Binding Row}" />
      <Setter Property="Grid.Column" Value="{Binding Column}" />
   </Style>
</Grid.ItemContainerStyle>

关于wpf - (WPF MVVM)如何将用户控件从 ViewModel 中的集合添加到 View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6373973/

相关文章:

c# - 是否可以安装一次 MaterialDesignThemes 包并能够在每个其他 wpf 项目上引用它?

c# - WPF 应用程序与 Winforms 应用程序有什么区别?

wpf - 在更改状态下更改 WPF 文本框的背景颜色

c# - Windows Phone 上的 WriteableBitmap 高速绘图

Silverlight 4 支持 x :TypeArguments

c# - 获取对 View 中单击项的引用

c# - 为什么我的 RichTextBox 没有更改前景色数据绑定(bind)

wpf - 我总是需要为日期格式编写转换器吗?

c# - 如何在 VS 2013 中更改预览中的程序名称?

c# - 当相关页面从后台堆栈中移除时,从内存中清除 View 模型 - WP8.1