Frage

ich zur Zeit die folgenden Methode verwenden, um die Farbe meiner Reihe Hintergrund eingestellt werden.

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");
    }
}

Das Problem ist, dass dieser Converter nur auf Bevölkerung der DataRow mit neuen Werten aufgerufen wird. Was ich wirklich brauchen, ist eine Art von Rückruf die Farbe nach einer bestimmten Zeit zu ändern oder die Konverter periodisch neu bewertet haben.

Die Farbe Update muss nicht sofort sein, nur innerhalb von wenigen Sekunden. Wenn ich für jede Zeile einen Rückruf habe, dann würde ich brauche so viele Threads zu entsprechen (sie erstellt werden und somit verfallen (die ihre Farbe ändert) zu verschiedenen Zeiten), mit ~ 1000 Zeilen dies scheint nicht, wie eine effiziente Option.

Die andere Option ist die Zeilen in einem Thread regelmäßig abzufragen und den Wandler bei jeder Iteration neu zu bewerten (alle 5 Sekunden?). Ich denke, dies ist wahrscheinlich der Weg zu gehen, aber ich weiß nicht, wie man in WPF gehen.

Vielleicht gibt es einen anderen Ansatz oder für eine solche Aufgabe zur Unterstützung gebaut?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Sollte möglich sein, den Binding vom DataRow zu bekommen und einfach Update / Update manuell so oft, wie Sie benötigen ...

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

Vergessen Sie nicht, auch die Update Eigenschaft auf der Bindung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top