(WPF MVVM)如何从ViewModel中的集合向View添加用户控件

Jos*_*lin 0 wpf xaml user-controls view mvvm

我想知道如何从集合中将用户控件添加到窗口中.目前我将我的视图文件夹中的控件添加到网格单元格中.

<views:MyControl Grid.Column="0" Grid.Row="0" Margin="10"/>
Run Code Online (Sandbox Code Playgroud)

我的视图模型中有一个ObservableCollection,它存储了一组用户控件.在我看来,我想从该集合中取一个控件并将其放入我的网格单元格中.我怎样才能像上面那样在网格中添加控件,但是从我的收藏中添加?

例如,{绑定路径控件.[1]

Rob*_*ney 5

如果某些内容包含一组用户控件,则它不是视图模型.

支持显示其他控件的视图的视图模型应包含这些控件的视图模型的集合.你应该绑定ItemsSourceItemsControl,以集合属性,然后用模板匹配和数据模板来创建控件.

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

<Window.Resources>
   <DataTemplate x:Key="{Type local:FooViewModel}">
      <local:FooView />
   </DataTemplate>
   <DataTemplate x:Key="{Type local:BarViewModel}">
      <local:BarView />
   </DataTemplate>
</WindowResources>
Run Code Online (Sandbox Code Playgroud)

一旦做到这一点,任何ItemsControlItemsSource绑定到这些视图模型的集合会发现模板,创建控件,并将其绑定到视图模型.

如果ItemsControl你使用的是a Grid,你可能还有一个额外的步骤.任何ItemsControl生成一个项容器(在Grid它的情况下,它是a ContentPresenter)来保持它正在显示的视图; 在a中Grid,您可能需要将Grid.Rowand 分配Grid.Column给该容器.假设您的视图模型具有RowColumn性能,要做到这一点的方法是:

<Grid.ItemContainerStyle>
   <Style TargetType="ContentPresenter">
      <Setter Property="Grid.Row" Value="{Binding Row}" />
      <Setter Property="Grid.Column" Value="{Binding Column}" />
   </Style>
</Grid.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)