datagridviewがあり、1つの列と他の2つの列の比較結果に応じて、行の背景色を動的に更新しようとしています。私のdatagridviewはデータテーブルにバインドされています。datagridviewの3つの異なる列は、min、max、およびpresentです。min列とmax列の値は静的であり、変更されません。各行の現在の列の値は動的に更新されます。
IValueConverterインターフェイスを実装するMinMaxTesterというクラスを使用して、セルの内容を比較し、ブラシの色を返します。
私が実装したソリューションでは、背景色が更新されることがあることに注意してください。datagridviewは、タブコントロール内のタブアイテムの一部です。datagridviewがユーザーに表示されていない場合、通常、背景色が更新されます。データグリッドビューがユーザーに表示されている場合(つまり、タブコントロール内のタブ項目が選択されている場合)、背景色は更新されません。
行の背景色が常に更新されるように、ソリューションで何を変更する必要があるのでしょうか。
XAMLファイルコード
<Window.Resources>
<local:MinMaxTester x:Key="MinMaxTester"/>
</Window.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Present" Binding="{Binding Present}"/>
<DataGridTextColumn Header="Min" Binding="{Binding Min}"/>
<DataGridTextColumn Header="Max" Binding="{Binding Max}"/>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{Binding Converter={StaticResource MinMaxTester}}"/>
</Style>
<DataGrid.RowStyle>
実装コード
[ValueConversion(typeof(DataRowView),typeof(Brush))]
public class MinMaxTester: IValueConverter
{
public object Convert(object datagridrow, Type target, object parameter, System.Globalization.CultureInfo culture)
{
int min, max, present;
DataRowView r = datagridrow as DataRowView;
min = int.Parse(r["Min"].ToString());
max = int.Parse(r["Max"].ToString());
present = int.Parse(r["Present"].ToString());
if (present >= min && present <= max)
return Brushes.Green;
else
return Brushes.Red;
}
public object ConvertBack(object datagridrow, Type target, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("Not using the ConvertBack function in MinMaxTester");
}
}