首页 文章

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

提问于
浏览
0

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

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

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

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

1 回答

  • 5

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

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

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

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

    完成此操作后,任何 ItemsControlItemsSource 绑定到这些视图模型的集合将找到模板,创建控件并将它们绑定到视图模型 .

    如果你使用的 ItemsControlGrid ,你可能还有一个额外的步骤 . 任何 ItemsControl 生成一个项容器(在 Grid 的情况下,它是一个 ContentPresenter )来保存它正在显示的视图;在 Grid 中,您可能需要将 Grid.RowGrid.Column 分配给该容器 . 假设您的视图模型具有 RowColumn 属性,则执行此操作的方法是:

    <Grid.ItemContainerStyle>
       <Style TargetType="ContentPresenter">
          <Setter Property="Grid.Row" Value="{Binding Row}" />
          <Setter Property="Grid.Column" Value="{Binding Column}" />
       </Style>
    </Grid.ItemContainerStyle>
    

相关问题