В настоящее время я использую следующий метод для установки цвета фона строки.
XAML
<Style TargetType="{x:Type xcdg:DataRow}">
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource colorConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="IsSelected"/>
<Binding BindsDirectlyToSource="True" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
C #
public class ColourConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var isRowSelected = (bool)values[0];
var myInstance = (MyClass) values[1];
// Return default
if (isRowSelected || myInstance == null)
return DependencyProperty.UnsetValue;
// Get the check for the current field
return GetColour(myInstance) ?? DependencyProperty.UnsetValue;
}
private static SolidColorBrush GetColour(MyClass myInstance)
{
if (heartbeat == null)
{
return null;
}
// Is it more two minutes old?
return (myInstance.CreatedDateTime + TimeSpan.FromMinutes(2) < Clock.UtcNow())
? Brushes.LightPink
: Brushes.LightGreen;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException(this.GetType().Name + " cannot convert back");
}
}
Проблема в том, что этот конвертервызывается только для заполнения DataRow с новыми значениями.Что мне действительно нужно, так это какой-то обратный вызов, чтобы изменить цвет через определенное время или периодически пересматривать конвертер.
Обновление цвета не должно быть мгновенным, всего за несколько секунд.Если бы у меня был обратный вызов для каждой строки, то мне нужно было бы сопоставить столько потоков (они созданы и, следовательно, имеют срок действия (который меняет свой цвет) в разное время), с ~ 1000 строк это не кажется эффективным вариантом.
Другой вариант заключается в периодическом опросе строк в одном потоке и повторной оценке преобразователя на каждой итерации (каждые 5 секунд?).Я думаю, что это, вероятно, путь, но я не знаю, как это сделать в WPF.
Возможно, есть другой подход или встроенная поддержка для такой задачи?
Спасибо взаранее!