我想知道如何将用户控件从集合中添加到窗口中。目前,我正在将 Views 文件夹中的控件添加到像这样的网格单元格中。
<views:MyControl Grid.Column="0" Grid.Row="0" Margin="10"/>
我的 View 模型中有一个 ObservableCollection,它存储了一组用户控件。在我看来,我想从该集合中获取一个控件并将其放入网格的单元格中。如何像上面所做的那样将控件添加到网格中,但是从我的集合中?
例如,类似于 {Binding Path controls.[1] 的东西
最佳答案
如果某物包含一组用户控件,则它不是 View 模型。
支持显示其他控件的 View 的 View 模型应该包含这些控件的 View 模型的集合。你应该绑定(bind)ItemsSource
的 ItemsControl
到集合属性,然后使用模板匹配和数据模板来创建控件。
因此,假设您要显示 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.Row
和 Grid.Column
到那个容器。假设您的 View 模型有 Row
和 Column
属性,这样做的方法是:<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/