我有一个 datagridview 并试图根据一列和其他两列之间的比较结果动态更新行的背景颜色。我的 datagridview 绑定到一个数据表。datagridview 中的三个不同列是 min、max 和 present。min 和 max 列中的值是静态的,不会更改。每行的当前列中的值动态更新。
我使用了一个名为 MinMaxTester 的类,它实现了 IValueConverter 接口来比较单元格的内容以返回画笔颜色。
使用我实施的解决方案,我注意到背景颜色有时会更新。datagridview 是选项卡控件中选项卡项的一部分。当 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");
}
}