C # DataGrid цвет ячейки кажется случайным wpf - PullRequest
0 голосов
/ 24 августа 2018

Я написал некоторый код, чтобы попытаться изменить цвет ячейки 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 голосов
/ 24 августа 2018

Это из-за виртуализации пользовательского интерфейса, то есть контейнеры элементов используются повторно при прокрутке элементов.

Вы можете отключить это, установив VirtualizingStackPanel.VirtualizationMode присоединенное свойство равным Standard, при потенциальной стоимости некоторой производительности прокрутки:

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

какова фактическая разница между свойством Recycling / Standard of VirtualizationMode в VirtualizingStackPanel?

Лучшим вариантом будет использование определенного CellStyle для каждого столбца, который привязывается к фактическому исходному свойству элемента, например ::

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