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

时间:2011-06-16 14:58:10

标签: wpf xaml mvvm user-controls view

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

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

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

例如{Binding Path controls。[1]

1 个答案:

答案 0 :(得分:5)

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

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

因此,我们假设您要在窗口中显示ItemsControlFooView个用户控件的集合。您将创建一个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将找到模板,创建控件并将它们绑定到视图模型。

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

Column