質問

現在、次の方法を使用して、行の背景の色を設定しています。

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の母集団でのみ呼び出されることです。私が本当に必要なのは、特定の時間の後に色を変更するか、コンバーターを定期的に再評価するためのある種のコールバックです。

カラーアップデートは、数秒以内に瞬時である必要はありません。各行のコールバックがある場合、一致するように多くのスレッドが必要です(それらは作成されるため、異なる時期に有効期限が切れます(色が変わります))。

もう1つのオプションは、1つのスレッドの行を定期的にポーリングし、各反復(5秒ごとに)でコンバーターを再評価することです。これはおそらく行く方法だと思いますが、WPFでそれについてどのように進むかわかりません。

おそらく、そのようなタスクをサポートする別のアプローチがありますか?

前もって感謝します!

役に立ちましたか?

解決

Datarowからバインディングエクセプションを取得し、必要に応じて何度もupdateSource/updateTargetを手動で呼び出すことができるはずです...

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

変更することも忘れないでください updatesourcetrigger バインディング上のプロパティ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top