C# / wpf -datagrid-タイムアウト後の要素の色を更新する
-
11-10-2019 - |
質問
現在、次の方法を使用して、行の背景の色を設定しています。
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 バインディング上のプロパティ。
所属していません StackOverflow