C # / WPF - DataGrid - обновить цвет элемента после тайм-аута - PullRequest
0 голосов
/ 17 декабря 2010

В настоящее время я использую следующий метод для установки цвета фона строки.

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.

Возможно, есть другой подход или встроенная поддержка для такой задачи?

Спасибо взаранее!

1 Ответ

0 голосов
/ 17 декабря 2010

Должно быть возможно получить BindingExpression из DataRow и просто вызвать UpdateSource / UpdateTarget вручную столько раз, сколько вам нужно ...

BindingExpression binding = Control.GetBindingExpression(DataRow.BackgroundProperty)
binding.UpdateSource;

Не забудьте также изменить UpdateSourceTrigger свойство на привязке.

...