首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DataGrid: DataType of ItemsSoure选择CellTemplate

WPF DataGrid: DataType of ItemsSoure选择CellTemplate
EN

Stack Overflow用户
提问于 2017-04-06 07:15:12
回答 2查看 3.7K关注 0票数 1

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

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

ItemsSource是

代码语言:javascript
复制
ObservableCollection<BaseModel>

包含类型项的

代码语言:javascript
复制
IncidentModel : BaseModel
ServiceModel : BaseModel

这就是我目前所处的地方:

代码语言:javascript
复制
<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>

感谢所有可能的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-06 08:56:47

你可以用DataTemplateSelector

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>
票数 5
EN

Stack Overflow用户

发布于 2017-11-13 12:51:28

用一个额外的ContentPresenter在XAML中完成这一切似乎是可行的:

代码语言:javascript
复制
<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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43248202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档