WPF DataGrid:按ItemsSource的数据类型选择CellTemplate
我正在构建一个DataGrid,我想在其中根据当前项的底层数据类型切换单元格内的图像 问题: 是否可以应用这种类型的模板切换? 最好只使用xaml 项目资源是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
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>
谢谢!工作起来很有魅力!谢谢工作起来很有魅力!