2012-05-04 3 views
0

У меня есть следующий код 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 

Спасибо за любую помощь.

+0

Я забыл упомянуть, что если в XAML я использую прокомментированный сеттер вместо используемого в настоящее время, все работает хорошо, поэтому я подозреваю, что это связано с использованием привязки в uncommented setter. – APaglia

+0

Попробуйте получить дополнительную информацию о привязке, добавив PresentationTraceSources.TraceLevel. Дополнительная информация по этому вопросу: http://bea.stollnitz.com/blog/?p=52 –

+0

Вы выполняете класс INotifyPropertyChanged? – Paparazzi

ответ

0

Я думаю, что это стоит проверить «IsEmpty» свойство сеттер в модели представления .. вы должны поднять свойство изменено событие из этого «IsEmpty» собственность сеттер ..

И убедитесь, чтобы установить значение по умолчанию для " Foreground "через сеттер. не устанавливайте значение по умолчанию для переднего плана тега.

+0

@Blam. Это более или менее то, что я сделал: я определил в модели представления свойство HasErrors, ссылаясь на коллекцию, используя также свойство IsEmpty для получения значения. Затем, используя интерфейс INotifyPropertyChanged, я направил событие в модель представления. – APaglia

Смежные вопросы