Изменение цвета DataCell меняет фон других ячеек - PullRequest
0 голосов
/ 04 июня 2018

У меня есть DataGrid, который я заполняю во время выполнения данными из базы данных SQLite.Когда пользователь редактирует ячейку в сетке данных, я хочу, чтобы эта ячейка изменила свой цвет фона.Итак, это код MCVE, из-за того, что я сделал:

public MainWindow()
{
    InitializeComponent();
    DataTable dt = new DataTable();
    dt.Columns.Add("Column1");
    dt.Columns.Add("Column2");
    for (int i = 0; i < 100; i++)
    {
        var r = dt.NewRow();
        r[0] = i ;
        r[1] = i * i;
        dt.Rows.Add(r);
    }
    myDataGrid.ItemsSource = dt.DefaultView;
}

private void myDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if (e.EditAction.ToString() == "Commit")
    {
        FrameworkElement element = e.Column.GetCellContent(e.Row);
        (element.Parent as DataGridCell).Background = new SolidColorBrush(Colors.Yellow);
    }
}

xaml:

<Grid>
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding"/>
</Grid>

Проблема в том, что при прокрутке я вижу другие ячейки, также окрашенные в желтый цвет.Кроме того, в зависимости от того, как я прокручиваю, желтый фон перепрыгивает с нужной ячейки на другую.Это происходит только в том случае, если для EnableRowVirtualization установлено значение true.Есть ли способ сделать это без отключения или это правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Итак, основываясь на ссылке Шоу Риши в ответном комментарии, я нашел решение.Проблема с отключением виртуализации строк - это производительность и память, особенно для больших сеток.Чтобы продолжать использовать виртуализацию и поддерживать фон в правильном положении, мне пришлось отменить событие CleanUpVirtualizedItem, если какая-либо из ячеек строки имеет цвет фона.

xaml:

<Grid>
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.CleanUpVirtualizedItem="myDataGrid_CleanUpVirtualizedItem"/>
</Grid>

codebehind:

private void myDataGrid_CleanUpVirtualizedItem(object sender, CleanUpVirtualizedItemEventArgs e)
{
    var row = e.UIElement as DataGridRow;
    for(int i = 0; i<(sender as DataGrid).Columns.Count; i++)
    {
        var cell = (DataGridCell)(sender as DataGrid).Columns[i].GetCellContent(row).Parent;
        if (cell.Background != Brushes.White) 
        {
            e.Cancel = true;
            break;
        }
    }            
}
0 голосов
/ 05 июня 2018

Я нашел это решение в сети.Я не знаю, если это правильный способ сделать это, хотя.Я думаю, это зависит от вас.

Я только что добавил VirtualizingStackPanel.VirtualizationMode = "Standard" в xaml:

    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.VirtualizationMode="Standard" /> 

Я выполнил и увидел, что раскраска теперь не переходит на другие ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...