Domanda

Attualmente uso il seguente metodo per impostare il colore del mio Row Sfondo.

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

Il problema è che questo convertitore viene chiamato solo sulla popolazione del DataRow con i nuovi valori. Quello che ho veramente bisogno è una sorta di callback per cambiare il colore dopo un certo tempo o di avere il convertitore rivalutato periodicamente.

L'aggiornamento colore non deve essere istantanea, solo nel giro di pochi secondi. Se ho un callback per ogni riga poi avrei bisogno di molti fili a partita (Essi vengono creati e quindi scadono (che cambia il loro colore) in tempi diversi), con ~ 1000 righe questo non sembra come un'opzione efficace.

L'altra opzione è quella di interrogare le file in un'unica filettatura periodicamente e rivalutare il convertitore in ogni iterazione (Ogni 5 secondi?). Penso che questa è probabilmente la strada da percorrere, ma non so come andare su di esso in WPF.

Forse c'è un altro approccio o un supporto incorporato per un tale compito?

Grazie in anticipo!

È stato utile?

Soluzione

Dovrebbe essere possibile ottenere il BindingExpression dal DataRow e semplicemente chiamare UpdateSource / UpdateTarget manualmente tutte le volte che è necessario ...

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

Non dimenticare di cambiare anche il UpdateSourceTrigger proprietà sul legame.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top