Предположительно, у вас есть некоторый механизм управления активными документами - перечисление их, идентификация активного документа и т. Д.
Я предлагаю вместо того, чтобы думать о том, чтобы брать команды из главного окна и пересылать их в документ, думать о них как о том, что они берут команды, доступные в активном документе, и присоединяют их к главному окну.
Каким бы ни был ваш общий интерфейс среди документов, добавьте некоторые свойства:
ICommand Undo { get; }
ICommand Redo { get; }
Теперь вы будете привязывать элементы управления вашего главного окна к ActiveDocument.Undo
и ActiveDocument.Redo
, где ActiveDocument
- это свойство в вашей модели представления основного окна. Когда ActiveDocument
изменится, вы получите уведомление об изменении свойства, чтобы кнопки могли соответственно быть включены / отключены.
Между прочим, когда я делал подобное, я раскрываю некоторый составной объект, свойства которого ICommands
являются свойствами, но с отдельными логическими свойствами CanUndo
/ CanRedo
и другими метаданными - что дает мне более хорошую абстракцию для управления включением и отключением в зависимости от состояния стеков команд.