C# 更改数据单元格颜色会更改其他单元格背景

C# 更改数据单元格颜色会更改其他单元格背景,c#,wpf,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

我有一个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);
    }
}
public主窗口()
{
初始化组件();
DataTable dt=新的DataTable();
dt.列。添加(“第1列”);
dt.列。添加(“第2列”);
对于(int i=0;i<100;i++)
{
var r=dt.NewRow();
r[0]=i;
r[1]=i*i;
dt.行。加(r);
}
myDataGrid.ItemsSource=dt.DefaultView;
}
私有void myDataGrid_CellEditEnding(对象发送方,DataGridCellEditEndingEventArgs e)
{
if(例如EditAction.ToString()=“提交”)
{
FrameworkElement=e.Column.GetCellContent(e.Row);
(element.Parent作为DataGridCell.Background=新的SolidColorBrush(Colors.Yellow);
}
}
xaml:



问题是,每当我滚动时,我看到其他单元格也被涂成黄色。另外,根据我滚动的方式,黄色背景会从我想要的单元格跳到另一个单元格。只有当
EnableRowVirtualization
设置为
true
时,才会发生这种情况。有没有一种方法可以不禁用它,或者这是正确的方法?

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

我刚刚在xaml中添加了VirtualizationMode=“Standard”:



我执行了这个命令,看到着色现在不会跳到其他单元格。

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

xaml:


代码隐藏:

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;
        }
    }            
}
private void myDataGrid\u CleanUpVirtualizedItem(对象发送方,CleanUpVirtualizedItemEventArgs e)
{
var row=e.UIElement作为DataGridRow;

对于(int i=0;iYou可以从以下链接看到它。示例中还有一个名为CleanUpVirtualizedItem的函数。它可能会为您提供一些额外的选项:阻止其他单元格变为黄色,但是,当您滚动时,黄色单元格(所需的单元格)失去颜色。请使用您提到的
CleanUpVirtualizedItem
来更正此问题,但提供的代码用于行背景,而不是单元格背景抱歉,我在滚动时没有意识到:/
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.VirtualizationMode="Standard" /> 
<Grid>
    <DataGrid x:Name="myDataGrid" CellEditEnding="myDataGrid_CellEditEnding" VirtualizingStackPanel.CleanUpVirtualizedItem="myDataGrid_CleanUpVirtualizedItem"/>
</Grid>
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;
        }
    }            
}