更改DataCell颜色会更改其他单元格背景

时间:2018-06-04 19:10:46

标签: c# wpf

我有一个DataGrid,我在运行时使用来自SQLite数据库的数据填充。当用户在datagrid中编辑单元格时,我希望该单元格更改其背景颜色。所以,这是我所做的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 :(得分:1)

所以,根据Shou Risha链接的回答评论,我想出了一个解决方案。禁用行虚拟化的问题是性能和内存,特别是对于大型网格。要继续使用虚拟化并保持背景正确,如果任何行单元格具有背景颜色,我必须取消r事件。

XAML:

CleanUpVirtualizedItem

代码隐藏:

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

答案 1 :(得分:0)

我在网上找到了这个解决方案。我不知道这是否是正确的方法。我猜这取决于你。

我刚刚将VirtualizingStackPanel.VirtualizationMode =“Standard”添加到xaml:

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

我执行并看到着色现在没有跳到其他细胞。

相关问题