2013-02-01 76 views
0

我一直在研究涉及移動多種形狀的WPF應用程序。它主要是MVVM並嚴重依賴於命令。直到最近,我還沒有擔心撤銷/重做。我認爲這不會太困難,因爲我的大部分更改都涉及繼承實現ICommand的基類CommandBase的命令。使用命令模式和ICommand對撤銷/重做進行參數跟蹤。存儲多個命令?

到目前爲止,我添加了另一個名爲IUndoCommand的接口,它使用ICommand。我添加了一個Undo方法,可以執行撤消操作時所需的操作。

我將爲撤銷和重做使用堆棧,但我遇到了Execute/Undo方法的參數問題。有沒有一種合適的方式來存儲這些類型對象的參數?向IUndoCommand添加字段/方法是否明智?如果是的話,我應該將它設置在Execute方法或構造函數中(如果我甚至可以)。

如果不是,我應該將它作爲堆棧中自己的對象傳遞給它?其次,(儘管這可能是它自己的問題)是否有更好的數據結構來跟蹤多個命令?我目前有一個循環運行多個命令來移動多個選定的形狀,並希望允許一個撤銷全部撤消它們。我想我可以將它轉換爲自己的命令並將命令傳遞給它,但是我又是新手,寧願做正確的事情。

感謝您的閱讀和任何幫助將不勝感激。

來源:

Code Project VisualStudioMagazine StackOverFlow

+0

你看的時代報設計模式?這是專門用於撤消的目的。正如你對隊列所做的那樣,重做只是模式的反轉。 http://en.wikipedia.org/wiki/Memento_pattern –

+0

我看到了,這是我最初開始工作。我覺得這樣可以給我更多的控制權,而且我已經做得更好。我有一個DrawingEditViewModel設置爲我的datacontext。這有可觀察的與模型交互的視圖模型集合。它還會跟蹤我的內容寬度/高度和消息(因爲存在縮放)。我可以將寬度/高度/縮放移動到另一個類,但仍然需要訪問它。 –

+0

這是一個問題,因爲在設計模式中最簡單的解決方案是整個視圖模型的深度複製是正確的?這會導致放大/縮小變化被保存爲一個非常煩人的步驟。用戶必須控制+ z 8次才能回到最後的視圖位置。我希望這是有道理的.. –

回答

1

由於接口不需要訪問數據(它應該只需要一個Undo()/Redo()方法對,並且潛在地可用於它是否能標誌撤消),它根本不需要了解參數。

一個選項可能是使您的實現IUndoCommand通用。然後,您可以使用它以類型安全的方式存儲參數。然後

CommandBase類可以是通用的,即:

class CommandBase<T> : ICommand, IUndoCommand 
{ 
    // You could then store the parameter directly... 
    public T Parameter { get; private set; } 
} 
+0

我明白了,我喜歡這個解決方案,但是可以將它設置在Execute方法中嗎?我會這麼認爲,因爲除非調用Execute,否則命令不會被添加到任何堆棧中。我只是不確定沒有更好的方法.. –