根据ViewModel类型为ItemsControl选择DataTemplate

时间:2016-01-13 13:55:56

标签: c# wpf xaml mvvm

我尝试使用不同的模板制作我的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。 我发现了一个小技巧。

2 个答案:

答案 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>