C# 变量在变化,但我不知道在哪里或为什么

C# 变量在变化,但我不知道在哪里或为什么,c#,wpf,datagrid,C#,Wpf,Datagrid,我正在为我的WPF datagrid实现一个撤销功能,但是我遇到了一些问题。我确信这只是对C语言及其语法的误解,但我不知道问题出在哪里。当单元格编辑结束时,我获取上一个项并显示一个项值Z以进行调试。它包含编辑前保留的项目,这是我想要的。但当我尝试“撤消”它时,我再次显示相同的值Z,但它已更改为datagrid中该项的当前值 CellEditEnding处理程序 private void toolGrid_CellEditEnding(object sender, DataGridVellEdi

我正在为我的WPF datagrid实现一个撤销功能,但是我遇到了一些问题。我确信这只是对C语言及其语法的误解,但我不知道问题出在哪里。当单元格编辑结束时,我获取上一个项并显示一个项值Z以进行调试。它包含编辑前保留的项目,这是我想要的。但当我尝试“撤消”它时,我再次显示相同的值Z,但它已更改为datagrid中该项的当前值

CellEditEnding处理程序

 private void toolGrid_CellEditEnding(object sender, DataGridVellEditEndingEventArgs e)
{
undoTool = toolsList[selectedToolNdx];
MessageBox.Show(undoTool.Z.ToString());
}
键控处理器

private void toolGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
 if((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
 {
  if (e.Key == Key.Z)
   {
     MessageBox.Show(undoTool.Z.ToString());
     e.Handled = true;
   }
  }
 }

例如,我可以将z值从3更改为5,然后触发celleditending事件,一个messagebox显示值“3”,目前为止效果良好。但是,我随后撤消了CTRL-Z,消息框现在显示值“5”,即使它仍然应该是3。为什么undoTool在更改,为什么它似乎在自行更改?

因为您不知道在何处或如何更改,因此必须使用调试器或可以访问变量内存空间的线程。在调试器的情况下,添加一个watch和break-on-access/read-write,在后者中使用一个线程并休眠,直到出现某种情况!=somethingElse==真;然后在调试之后执行逻辑。根据您在系统中的访问级别,您还可以使用一些常数(但不太清楚)确定函数调用和调用者

[CallerMemberName]字符串成员名=, [CallerFilePath]字符串sourceFilePath=, [CallerLineNumber]int sourceLineNumber=0


您也可以在“监视”窗口中使用一个指针。问题是,当“保存”旧值时,它会简单地将自身保存为变量“undoTool”中的引用。因为它是一个引用,所以它不做任何其他事情,然后引用它的基础对象,即您正在编辑的值。这意味着无论何时更改基本对象,对它的所有引用都将返回与您将其更改为的值相同的值


您应该特别告诉.NET使用new关键字创建一个新对象,然后将变量存储在其中

这是WPF DataGrid预期行为的一部分。很抱歉,我不知道新关键字的位置。我是否放置undoTool=新工具类;undoTool=toolsList[selectedToolNdx];在牢房里编辑结尾?我想是的。另一种方法是实现工具类的iClonable,只需使用toolsList[selectedToolNdx].Clone即可。要保存整个对象还是仅保存其文本?因为如果要保存文本,最好使用字符串。