我正在为我的WPF数据网格实现一个撤销功能,但是我遇到了问题。我确信这只是对C#语言及其语法的误解,但我不知道问题是什么。当单元格编辑结束时,我获取前一项并显示项目值(Z)(用于调试目的)。它包含编辑前持有的项目(这就是我想要的)。但是当我尝试“撤消”它时,我再次显示SAME值(Z),但它已更改为数据网格中该项目的当前值。
CellEditEnding Handler
private void toolGrid_CellEditEnding(object sender, DataGridVellEditEndingEventArgs e)
{
undoTool = toolsList[selectedToolNdx];
MessageBox.Show(undoTool.Z.ToString());
}
KeyDown处理程序
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事件将触发,消息框显示值'3'(到目前为止一直很好)。然而,我然后撤消(CTRL-Z)并且消息框现在显示值'5',即使它仍然是3.为什么undoTool会改变(为什么它似乎会自行改变)?
答案 0 :(得分:0)
由于您不知道在何处或如何使用调试器或有权访问变量内存空间的线程。对于后者中的调试器Add a watch and break on access / read write
,使用线程并休眠直到something != somethingElse == true;
然后在调试之后执行逻辑。根据您在系统中的访问级别,您可以使用一些常量来确定函数调用和调用者,但是知之甚少。How to get the name of the current method from code
或
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
您还可以使用Watch
窗口
答案 1 :(得分:0)
问题在于,在“保存”旧值时,它会将自身保存为变量“undoTool”中的引用。因为它的引用它不会做任何其他事情,然后引用它的基础对象,这是您正在编辑的值。这意味着无论何时更改基础对象,对它的所有引用都将返回与您更改它的值相同的值。
你应该具体告诉.NET创建一个新对象,从而使用new
关键字,然后将变量存储在其中。