WPF DataGrid:按ItemsSource的数据类型选择CellTemplate

WPF DataGrid:按ItemsSource的数据类型选择CellTemplate,wpf,types,datagrid,celltemplate,Wpf,Types,Datagrid,Celltemplate,我正在构建一个DataGrid,我想在其中根据当前项的底层数据类型切换单元格内的图像 问题: 是否可以应用这种类型的模板切换? 最好只使用xaml 项目资源是 ObservableCollection<BaseModel> 这就是我目前的处境: <DataGrid ItemsSource="{Binding TicketCollection,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" IsReadOnl

我正在构建一个DataGrid,我想在其中根据当前项的底层数据类型切换单元格内的图像

问题: 是否可以应用这种类型的模板切换? 最好只使用xaml

项目资源是

ObservableCollection<BaseModel>
这就是我目前的处境:

<DataGrid 
    ItemsSource="{Binding TicketCollection,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"
    IsReadOnly="True"
    AutoGenerateColumns="False"
    DockPanel.Dock="Top">

    <DataGrid.Resources>
        <DataTemplate DataType="{x:Type models:IncidentModel}">
            <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" />

        </DataTemplate>
        <DataTemplate DataType="{x:Type models:ServiceModel}">
            <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" />

        </DataTemplate>
    </DataGrid.Resources>

    <DataGrid.Columns>

        <DataGridTemplateColumn Header="Typ">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>

                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn Header="Id" Binding="{Binding Id,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" />
        <DataGridTextColumn Header="Titel" Binding="{Binding Title,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" />
        <DataGridTextColumn Header="Status" Binding="{Binding Status,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" />
        <DataGridTextColumn Header="Erstellung" Binding="{Binding CreatedDate,UpdateSourceTrigger=PropertyChanged,Mode=OneWay}" />
    </DataGrid.Columns>
</DataGrid>


谢谢你的帮助

您可以使用
DataTemplateSelector

public class MyTemplateSelector : DataTemplateSelector
{
    public DataTemplate IncidentTemplate { get; set; }
    public DataTemplate ServiceTemplate { get; set; }

    public override DataTemplate SelectTemplate
        (object item, DependencyObject container)
    {
        if (item is IncidentModel) return IncidentTemplate;
        else if (item is ServiceModel) return ServiceTemplate;
        else return base.SelectTemplate(item, container);
    }
}
XAML

<DataGrid 

    ...

    >
    <DataGrid.Resources>
        <DataTemplate x:Key="IncidentTemplate" DataType="{x:Type models:IncidentModel}">
            <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" />
        </DataTemplate>
        <DataTemplate x:Key="ServiceTemplate" DataType="{x:Type models:ServiceModel}">
            <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" />
        </DataTemplate>

        <local:MyTemplateSelector x:Key="MyTemplateSelector"
            IncidentTemplate="{StaticResource IncidentTemplate}"
            ServiceTemplate="{StaticResource ServiceTemplate}" />

    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Typ" 
            CellTemplateSelector="{StaticResource MyTemplateSelector}" />

        ...

    </DataGrid.Columns>
</DataGrid>

...

您可以使用
DataTemplateSelector

public class MyTemplateSelector : DataTemplateSelector
{
    public DataTemplate IncidentTemplate { get; set; }
    public DataTemplate ServiceTemplate { get; set; }

    public override DataTemplate SelectTemplate
        (object item, DependencyObject container)
    {
        if (item is IncidentModel) return IncidentTemplate;
        else if (item is ServiceModel) return ServiceTemplate;
        else return base.SelectTemplate(item, container);
    }
}
XAML

<DataGrid 

    ...

    >
    <DataGrid.Resources>
        <DataTemplate x:Key="IncidentTemplate" DataType="{x:Type models:IncidentModel}">
            <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" />
        </DataTemplate>
        <DataTemplate x:Key="ServiceTemplate" DataType="{x:Type models:ServiceModel}">
            <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" />
        </DataTemplate>

        <local:MyTemplateSelector x:Key="MyTemplateSelector"
            IncidentTemplate="{StaticResource IncidentTemplate}"
            ServiceTemplate="{StaticResource ServiceTemplate}" />

    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Typ" 
            CellTemplateSelector="{StaticResource MyTemplateSelector}" />

        ...

    </DataGrid.Columns>
</DataGrid>

...

在XAML中使用一个附加的
内容演示器来完成这一切似乎是可行的:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Typ">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentPresenter Content="{Binding}">
                        <ContentPresenter.Resources>
                            <DataTemplate DataType="{x:Type models:IncidentModel}">
                                <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" />
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type models:ServiceModel}">
                                <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" />
                            </DataTemplate>
                        </ContentPresenter.Resources>
                    </ContentPresenter>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在XAML中使用一个附加的
内容演示器来完成这一切似乎是可行的:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Typ">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentPresenter Content="{Binding}">
                        <ContentPresenter.Resources>
                            <DataTemplate DataType="{x:Type models:IncidentModel}">
                                <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/Active_16.png" />
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type models:ServiceModel}">
                                <Image Source="pack://application:,,,/SMLib;component/Files/Images/16x16/IncidentMgmt_AllIncidents_16.png" />
                            </DataTemplate>
                        </ContentPresenter.Resources>
                    </ContentPresenter>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>


谢谢!工作起来很有魅力!谢谢工作起来很有魅力!