0

我目前使用以下方法来设置行背景的颜色。

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 中进行。

也许有另一种方法或内置支持这样的任务?

提前致谢!

4

1 回答 1

0

应该可以从 DataRow 中获取 BindingExpression 并根据需要手动多次调用 UpdateSource/UpdateTarget ...

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

不要忘记更改绑定上的UpdateSourceTrigger属性。

于 2010-12-17T20:04:03.667 回答