Как применить стили к DataGridRow с помощью DataTrigger - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь применить некоторые условные стили к DataGridRow, это то, что у меня пока есть:

  <DataGrid.ItemContainerStyle>
    <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
      <Style.Triggers>
        <DataTrigger Value="True">
          <DataTrigger.Binding>
            <MultiBinding Converter="{StaticResource SBCInvalidHighlightConverter}">
              <Binding Path="." />
              <Binding Path="DataContext.SelectedCaseType" RelativeSource="{RelativeSource AncestorType=DataGrid}" />
              <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType=DataGridRow}"/>
            </MultiBinding>
          </DataTrigger.Binding>
          <Setter Property="Foreground" Value="Red"/>
          <Setter Property="ToolTip">
            <Setter.Value>
              <TextBlock Text="This criteria will not be applied"/>
            </Setter.Value>
          </Setter>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </DataGrid.ItemContainerStyle>

В основном я пытаюсь запустить этот конвертер SBCInvalidHighlightConverter, чтобы сделать три вещи:

  1. Применять красный шрифт, когда преобразователь возвращает значение true (неверная запись)

  2. Примените красный шрифт также, когда строка выбрана, и конвертор возвращает значение true, в тот момент, когда при выборе он меняет цвет по умолчанию на белый, я хочу, чтобы он оставался красным.

  3. Показывать всплывающую подсказку, когда преобразователь возвращается в исходное состояние, в тот момент, когда он просто открывает окно с надписью "System. Windows .Controls.TextBlock"

Я работаю с первым, но не со вторым и третьим.

Изображение, показывающее выделение и курсор при всплывающем тексте:

enter image description here

Итак, вопрос в том, как заставить работать пункты 2 и 3?

А вот преобразователь, не уверен, нужен ли он или нет:

  public class SBCInvalidHighlightConverter : IMultiValueConverter
  {
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      bool result = false;

      if (values == null || values.Length < 2)
        return result;

      CTS_EF_DAL.RBCRuleValueForDisplay rowData = (CTS_EF_DAL.RBCRuleValueForDisplay)values[0];

      SBC.SubstanceTypeCode criteriaType = (SBC.SubstanceTypeCode)rowData.Rule_Typ_Cd;
      SBC.CaseType caseType = (SBC.CaseType)((int)values[1]);

      if (caseType != SBC.CaseType.All)
      {
        var caseTypeAttribute = criteriaType.GetAttribute<SBC.CaseTypeAttribute>();
        if (caseTypeAttribute != null && caseTypeAttribute.CaseType != SBC.CaseType.All)
        {
          if (caseTypeAttribute.CaseType != caseType)
          {
            return true; //It is invalid
          }
        }
      }

      return result;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }

1 Ответ

1 голос
/ 14 апреля 2020

Если вы хотите изменить Foreground, вы должны указать CellStyle вместо RowStyle.

Вы также можете установить для свойства ToolTip значение string напрямую. Просто убедитесь, что вы не установили свойство ToolTip в другом месте за пределами Style.

Попробуйте это:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
            </Trigger>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/>
            </Trigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsSelected" Value="true"/>
                    <Condition Property="Selector.IsSelectionActive" Value="false"/>
                </MultiTrigger.Conditions>
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
            </MultiTrigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
            </Trigger>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource SBCInvalidHighlightConverter}">
                        <Binding Path="." />
                        <Binding Path="DataContext.SelectedCaseType" RelativeSource="{RelativeSource AncestorType=DataGrid}" />
                        <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType=DataGridRow}"/>
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="Foreground" Value="Red"/>
                <Setter Property="ToolTip" Value="This criteria will not be applied" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

Приведенное выше значение Style основано на стиле по умолчанию для DataGridCell для Windows 10. Я только добавил ваш триггер. Конечно, вы можете редактировать в соответствии с вашими точными требованиями.

...