2014-05-21 132 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窗口

相關問題