C#DataGrid单元格颜色似乎是随机WPF

时间:2018-08-24 14:12:40

标签: c# wpf datagrid cell

我已经编写了一些代码来尝试根据单元格内部值的长度来更改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

您会看到一些不应该突出显示的值被突出显示,反之亦然

1 个答案:

答案 0 :(得分:1)

这是由于UI虚拟化所致,即在您滚动项目时重复使用了项目容器。

您可以通过将VirtualizingStackPanel.VirtualizationMode的附加属性设置为Standard来禁用此功能,这可能会降低某些滚动性能:

<DataGrid ... VirtualizingStackPanel.VirtualizationMode="Standard">

what is the actual difference between Recycling/Standard of VirtualizationMode property in VirtualizingStackPanel?

一个更好的选择是对绑定到项目实际来源属性的每一列使用特定的CellStyle,例如:

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Background" Value="{Binding Name, 
                                    Converter={StaticResource ValueToBrushConverter}}" />
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>