Триггер WPF на основе типа значения DataGridCell

#c# #wpf

Вопрос:

То, что я пытаюсь, это

 <local:class_converter_data_type x:Key="DataTypeConverter"/>
 <Style TargetType="{x:Type DataGridCell}">
     <Style.Triggers>
         <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource DataTypeConverter}}" Value="{x:Type sys:DateTime}">
             <Setter Property="FontStyle" Value="Italic" />
         </DataTrigger>
   </Style.Triggers>
</Style>
       
 public class class_converter_data_type : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
           return value?.GetType() ?? Binding.DoNothing;
       }
 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
          throw new NotImplementedException();
         }
   }
 

Какие ошибки я здесь совершаю? Формат привязки имеет какие-либо ошибки или в преобразовании?

Ответ №1:

Вы не должны делать это вот так. DataGridCell Он непосредственно не содержит никакой информации о типе базового типа данных. Самый простой способ-прослушать DataGrid.AutoGeneratingColumn событие и настроить внешний вид содержимого столбца:

Главное окно.xaml

 <DataGrid AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" />
 

Главное окно.xaml.cs

 private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
  var dataGrid = sender as DataGrid;
  if (e.PropertyType.Equals(typeof(DateTime)) 
    amp;amp; e.Column is DataGridTextColumn column)
  {
    column.FontStyle = FontStyles.Italic;
  }
}
 

В случае, если вы не создаете столбцы автоматически, вы можете задать стиль шрифта, установив атрибут DataGridTextColumn.FontStyle XAML.

 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn FontStyle="Italic" />
  </DataGrid.Columns>
</DataGrid>
 

Комментарии:

1. О, большое спасибо, я не понял, что DataGridCell содержит текстовый блок. Большое спасибо за мгновенную помощь. Я буду использовать событие DataGrid_AutoGeneratingColumn.

2. Да, текстовый блок неявно создается для отображения значений после вызова toString() для нестроковых типов.