我已经编写了一些代码来尝试根据单元格内部值的长度来更改DataGrid单元格的颜色。但是,当它加载到前几行时,它似乎可以正常工作,但是当我向下滚动查看时,它似乎随机改变了颜色。
我背后的XML是:
<DataGrid Grid.Row="2" Name="DataGridView1" CanUserSortColumns="False" CanUserReorderColumns="False" IsReadOnly="True" ItemsSource="{Binding}" Background="LightGray" RowBackground="#BDBDBF" AlternatingRowBackground="#E3E3E5" CellStyle="{StaticResource CellStyle}">
我的“ CellStyle”资源是
<local:ValueToBrushConverter x:Key="ValueToBrushConverter"/>
<Style x:Key="CellStyle" TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ValueToBrushConverter}}" />
</Style>
最后我的ValueToBrushConverter是:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DataGridCell dgc = (DataGridCell)value;
System.Data.DataRowView rowView = (System.Data.DataRowView)dgc.DataContext;
var input = rowView.Row.ItemArray[dgc.Column.DisplayIndex];
StreamWriter sw = new StreamWriter(@"C:\DM Data\Inputs.txt",true);
sw.WriteLine(input + " " + input.ToString().Length);
sw.Close();
sw.Dispose();
if (input.ToString().Length < 32)
return new SolidColorBrush(Colors.LimeGreen);
else if (input.ToString().Length >= 32)
return (SolidColorBrush)(new BrushConverter().ConvertFrom("#FF1616"));
else
return new SolidColorBrush(Colors.Black);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
请注意,streamwriter仅用于我的测试,以查看返回的值。
如前所述,该代码最初有效,但是在停止工作之后,此gif显示了我的意思
https://gyazo.com/099873b8738887bddaf418c3b45129e3
您会看到一些不应该突出显示的值被突出显示,反之亦然
答案 0 :(得分:1)
这是由于UI虚拟化所致,即在您滚动项目时重复使用了项目容器。
您可以通过将VirtualizingStackPanel.VirtualizationMode
的附加属性设置为Standard
来禁用此功能,这可能会降低某些滚动性能:
<DataGrid ... VirtualizingStackPanel.VirtualizationMode="Standard">
一个更好的选择是对绑定到项目实际来源属性的每一列使用特定的CellStyle
,例如:
<DataGridTextColumn Binding="{Binding Name}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding Name,
Converter={StaticResource ValueToBrushConverter}}" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>