我尝试使用不同的模板制作我的ItemsControl
显示项,具体取决于其viewModel类型。初看起来我认为可以像ContentControl
中那样做:
<ItemsControl ItemsSource="{Binding MyViewModelCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type myNameSpace:myViewModel1}">
<myNameSpace:myControl2/>
</DataTemplate>
<DataTemplate DataType="{x:Type myNameSpace:myViewModel2}">
<myNameSpace:myControl2/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但遗憾的是,DataTemplate
中不能有两个ItemsControl.ItemTemplate
。
我发现了一个小技巧。
答案 0 :(得分:5)
在您的XAML代码中,只需将ItemsControl.ItemTemplate
标记替换为ItemsControl.Resources
,它就可以正常工作。
<ItemsControl ItemsSource="{Binding MyViewModelCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type myNameSpace:myViewModel1}">
<myNameSpace:myControl2/>
</DataTemplate>
<DataTemplate DataType="{x:Type myNameSpace:myViewModel2}">
<myNameSpace:myControl2/>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
答案 1 :(得分:0)
因此,您可以将ContentControl
放入ItemsControl
DataTemplate
,然后就可以了。
<ItemsControl ItemsSource="{Binding MyViewModelCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type myNameSpace:myViewModel1}">
<myNameSpace:myControl2/>
</DataTemplate>
<DataTemplate DataType="{x:Type myNameSpace:myViewModel2}">
<myNameSpace:myControl2/>
</DataTemplate>
</ResourceDictionary>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>