Wpf ItemsControl与viewmodel的多个数据模板
是否可以将画布作为模板的itemscontrol绑定到多个DataTemplates 我有2个集合,根据类型,我希望在画布上显示不同的控件 我不确定,但我可以考虑一个Viewmodel,它有两个可观察的集合。例如,如果我有“形状”和“连接”,我想在画布上同时显示它们?在诊断场景中 我想以mvvm的方式来做这件事,我不确定多数据模板方法是否正确,但我想到了这一点。 但我仍然有问题,让绑定在我的头脑中。如果我将DataContext设置为ViewModel,则似乎无法将2个集合绑定到items控件=( 我也对其他想法持开放态度Wpf ItemsControl与viewmodel的多个数据模板,wpf,silverlight,data-binding,mvvm,viewmodel,Wpf,Silverlight,Data Binding,Mvvm,Viewmodel,是否可以将画布作为模板的itemscontrol绑定到多个DataTemplates 我有2个集合,根据类型,我希望在画布上显示不同的控件 我不确定,但我可以考虑一个Viewmodel,它有两个可观察的集合。例如,如果我有“形状”和“连接”,我想在画布上同时显示它们?在诊断场景中 我想以mvvm的方式来做这件事,我不确定多数据模板方法是否正确,但我想到了这一点。 但我仍然有问题,让绑定在我的头脑中。如果我将DataContext设置为ViewModel,则似乎无法将2个集合绑定到items控件=
这可能吗?如果可能的话,绑定看起来会像一个数据模板选择器:或者
.您可以在ViewModel中拥有
ObservableCollection
,并将ItemsControl的源绑定到此集合
然后,为了获得不同类型数据的不同外观,您可以使用两个不带x:Key的DataTemplates,但在您的资源中使用正确设置的DataType。ItemsControl将自动为您的项目选择适当的DataTemplate。您可以创建多个
ObservableCollections
,然后绑定项目资源代码>到加入这些集合的
然后,在XAML中,您可以使用DataType
属性为相应的类型创建不同的DataTemplates
,如果将其放置在资源中,将自动应用类似样式。(如果CollectionContainers
应该绑定,您也可以在MSDN上显示的XAML中创建组合)
示例代码:
ObservableCollection数据1=新的ObservableCollection(新员工[]
{
新员工(“Hans”、“程序员”),
新员工(“Elister”、“程序员”),
新员工(“Steve”、“GUI设计师”),
新员工(“Stefan”、“GUI设计师”),
新员工(“乔”,“咖啡能手”),
新员工(“朱利安”、“程序员”),
});
ObservableCollection数据2=新的ObservableCollection(新机器[]
{
新机器(“E12”、“GreedCorp”),
新机器(“E11”、“GreedCorp”),
新机器(“F1-MII”、“商业公司”),
新机器(“F2-E5”、“商业公司”)
});
CompositeCollection coll=新的CompositeCollection();
coll.Add(new CollectionContainer(){Collection=data1});
coll.Add(new CollectionContainer(){Collection=data2});
数据=coll;
这里我使用不同的面板,但画布应该是相同的。另一个代码较少的选项是定义两个列表框,每个列表框都有自己的模板并绑定到自己的集合。在相同的物理空间中定义每个列表框,并根据您的状态控制哪个列表框可见。您甚至可以使用t可视化状态管理器和自定义状态。WPF和Silverlight都需要它吗?从长远来看,两者都很好……但第一个WPF将非常好……DataTemplateSelector将同时适用于WPF
和Silverlight
。不幸的是,COmpositeCollection不适用于UWP框架。如果Employee和Machine类是both继承自同一个类X,不需要CompositeCollection,一个ObservableCollection的X就足够了。@Viliam:当然,但这是一个主要的假设,在很多情况下是不成立的。
<ItemsControl ItemsSource="{Binding Data}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:Employee}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text=" ("/>
<TextBlock Text="{Binding Occupation}"/>
<TextBlock Text=")"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Machine}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Model}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Manufacturer}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>