Настройка цвета текста XAML Datagrid для каждой строки

Я пытаюсь добавить проверку в сетку данных в XAML.

В настоящее время я создал метод, который проверяет 3 текстовых поля на допустимый ввод, и если false устанавливает значение в коллекции, к которой привязана сетка данных, либо true, либо false. Эта часть работает нормально.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, чтобы заставить это действительно работать.

Я создал конвертер:

 public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
     bool isRowValid = ((bool)value);

     ConsoleColor validColour = ConsoleColor.Green;
     ConsoleColor invalidColour = ConsoleColor.Red;

     if (isRowValid)
     {
        return validColour;
     }
     else
     {
        return invalidColour;
     }
  }

Поэтому, когда строка недействительна, она будет отображаться красным цветом, если она действительна, она будет отображаться зеленым.

Метод проверки каждой строки вызывается, когда строка теряет фокус, и по умолчанию каждая строка устанавливается как недействительная.

Я пытался установить фон для каждой строки, выполнив

<DataGrid.RowBackground>
    <SolidColorBrush Color="{Binding Path=IsRowValid, Converter={StaticResource RowValidConverter}}" />
</DataGrid.RowBackground>

но в идеале я хотел бы настроить только цвет текста, а не фон.

Любые предложения о том, как реализовать это, будут очень признательны,

Спасибо.


person Purplegoldfish    schedule 22.02.2011    source источник


Ответы (1)


Если я правильно понимаю вашу проблему, то я думаю, что более простой подход - добавить триггер для Validation.HasError в RowStyle.

<DataGrid ...>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="TextElement.Foreground" Value="Green"/>
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="TextElement.Foreground" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <!--...-->
</DataGrid>

Или, если вы управляете этим другим способом с помощью свойства с именем IsRowValid в вашей модели представления, вы можете просто изменить триггер на DataTrigger

<DataTrigger Binding="{Binding IsRowValid}" Value="True">
    <Setter Property="TextElement.Foreground" Value="Red"/>
</DataTrigger>
person Fredrik Hedblad    schedule 22.02.2011
comment
Спасибо за быстрый ответ. Будет ли это обновление во время выполнения, когда пользователи редактируют данные? - person Purplegoldfish; 22.02.2011
comment
@Purplegoldfish: Да, Validation.HasError — это присоединенное свойство, поэтому триггер всегда будет получать уведомления при каждом изменении его значения. Если вы хотите выполнить привязку к своему свойству IsRowValid, оно должно быть либо свойством зависимости, либо вам необходимо реализовать INotifyPropertyChanged. - person Fredrik Hedblad; 22.02.2011
comment
Спасибо, мне было интересно, почему он не обновляется, а потом заметил, что сделал опечатку! отлично работает теперь ура. - person Purplegoldfish; 22.02.2011