Стек идеально подходит, если вы нажимаете «изменение» на него, а когда отменяете, вынимаете «изменение» из него.Затем вы помещаете это измененное изменение в другой стек, представляющий повтор.В какой-то момент в будущем, мы надеемся, что при сохранении вы очистите оба стека.
Это на самом деле не так просто, как вам нужно записать тип изменения, понять старые и новые значения и т. Д.Поэтому, когда вы извлекаете из стека отмены, всплывающее окно должно описывать, каким было предыдущее значение и каким элементом управления оно было установлено.
Инверсия для стека повторения, оно должно понимать, какое новое значение былои куда это делось.Но да, идея двух стеков - это хорошее начало для отмены повторов в домашнем пиве.
Хороший пример отмены на основе бизнес-объектов - CSLA.NET, которая имеет UndoableBase
:
http://www.lhotka.net/cslanet/
http://www.koders.com/csharp/fidCF6AB2CF035B830FF6E40AA22C8AE7B135BE1FC0.aspx?s=serializationinfo
Однако здесь записывается снимок состояния объекта, поэтому он будет более продвинутым, чем ваша концепция на основе форм.Тем не менее, CSLA.NET предлагает полную поддержку связывания данных, поэтому объект, связанный с данными, наследуемый от UndoableBase
, естественно будет поддерживать отмену (не повтор) в пользовательском интерфейсе.