У меня есть следующий код XAML, где я пытаюсь установить передний план каждой строки в DataGrid Toolkit на основе конвертера и DataTrigger.DataTrigger оценивает только в первый раз
Конвертер проверяет полученный объект, который содержит коллекцию других объектов, реализующих интерфейс IDataErrorInfo. Если в коллекции есть элементы с ошибками, тогда цвет будет оранжевым, в противном случае - синим. Если коллекция не содержит непустых элементов, цвет устанавливается на черный.
Теперь, когда я изменяю коллекцию из пользовательского интерфейса, все работает хорошо в первый раз, и цвет правильно установлен. Но тогда кажется, что DataTrigger больше не оценивается, потому что конвертер не останавливается в режиме отладки.
Я не могу понять, чего не хватает.
Мой XAML:
<tk:DataGrid.RowHeaderStyle >
<Style BasedOn="{StaticResource ResourceKey={x:Type tk:DataGridRowHeader}}" TargetType="tk:DataGridRowHeader">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type tk:DataGridRow}}, Path=DataContext.Payload.TimeEventFunctions[0].IsEmpty}" Value="False">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type tk:DataGridRow}}, Path=DataContext.Payload, Converter={inf:DataGridRowHeaderForegroundConverter}}" />
<!--<Setter Property="Foreground" Value="DodgerBlue" />-->
</DataTrigger>
</Style.Triggers>
</Style>
и преобразователь:
Public Class DataGridRowHeaderForegroundConverterExtension
Inherits Markup.MarkupExtension
Implements IValueConverter
Public Overrides Function ProvideValue(serviceProvider As System.IServiceProvider) As Object
Return Me
End Function
Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
Dim ret As New SolidColorBrush(Colors.Black)
If TypeOf value Is ISampleTableEntry Then
Dim ste As ISampleTableEntry = DirectCast(value, ISampleTableEntry)
Dim tevs As TrulyObservableCollection(Of ITimeEvFunc) = ste.TimeEventFunctions
If tevs.Count > 0 AndAlso Not tevs(0).IsEmpty Then
Dim query = From t In tevs Where t.HasErrors Select t
If query IsNot Nothing Then
Dim ErrorsPresent As Boolean = query.Count > 0
ret = New SolidColorBrush(Color.FromArgb(255, 255, 200, 0))
Else
ret = New SolidColorBrush(Colors.DodgerBlue)
End If
End If
End If
Return ret
End Function
Public Function ConvertBack(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
Throw New NotSupportedException
End Function
End Class
Спасибо за любую помощь.
Я забыл упомянуть, что если в XAML я использую прокомментированный сеттер вместо используемого в настоящее время, все работает хорошо, поэтому я подозреваю, что это связано с использованием привязки в uncommented setter. – APaglia
Попробуйте получить дополнительную информацию о привязке, добавив PresentationTraceSources.TraceLevel. Дополнительная информация по этому вопросу: http://bea.stollnitz.com/blog/?p=52 –
Вы выполняете класс INotifyPropertyChanged? – Paparazzi