2014-05-21 91 views
0

我正在为我的WPF数据网格实现撤消功能,但是我遇到了问题。我相信这只是对C#语言及其语法的误解,但我不知道问题出在哪里。当单元格编辑结束时,我获得前一个项目并显示项目值(Z)(用于调试目的)。它包含在编辑之前举行的项目(这是我想要的)。但是,当我尝试“撤消”它时,我再次显示SAME值(Z),但它已更改为该数据网格中该项目的当前值。变量变化,但我不知道在哪里或为什么

CellEditEnding处理程序

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.为什么撤销工具改变了(为什么它自己改变了)?

+0

这是WPF DataGrid预期行为的一部分。 –

回答

0

问题是,当'保存'旧值时,它简单地将自身保存为变量'undoTool'内的引用。因为它的引用它没有做任何事情,所以引用它的基础对象,这是你正在编辑的值。这意味着无论何时您更改基础对象,对它的所有引用都将返回与您更改的值相同的值。

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

+0

我很抱歉,我不知道新关键字在哪里。我是否把“undoTool = new ToolClass(); undoTool = toolList [selectedToolNdx];”在单元格编辑结束? – TheBlindSpring

+1

我相信如此。另一种方法是在你的ToolClass中实现'ICloneable',并使用'toolsList [selectedToolNdx] .Clone()'。你想保存整个对象还是只保存它的文本?因为如果你想保存文本,你最好使用一个字符串。 –

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窗口

相关问题