Question

J'utilise actuellement la méthode suivante pour définir la couleur de mon arrière-plan de la ligne.

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

Le problème est que ce convertisseur est appelé uniquement sur la population de la DataRow avec de nouvelles valeurs. Ce que je vraiment besoin est une sorte de rappel pour changer la couleur après un certain temps ou d'avoir le convertisseur réévalue périodiquement.

La mise à jour de couleur ne doit pas être instantanée, juste en quelques secondes. Si j'ai un rappel pour chaque ligne alors je besoin d'autant de fils pour correspondre (Ils sont créés et expirent donc (ce qui change leur couleur) à des moments différents), avec ~ 1000 lignes cela ne semble pas être une option efficace.

L'autre option consiste à interroger les rangées sur un fil périodiquement et de réévaluer le convertisseur à chaque itération (toutes les 5 secondes?). Je pense que cela est probablement le chemin à parcourir, mais je ne sais pas comment s'y prendre dans WPF.

Peut-être il y a une autre approche ou un support intégré pour une telle tâche?

Merci à l'avance!

Était-ce utile?

La solution

devrait être possible d'obtenir le BindingExpression du DataRow et simplement appeler UpdateSource / UpdateTarget manuellement autant de fois que vous avez besoin ...

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

Ne pas oublier de changer aussi le la propriété de UpdateSourceTrigger sur la liaison.

scroll top