В WPF как я могу переслать команду на дочерний элемент управления? - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть MVVM-подобная ситуация (без использования каких-либо платформ), где у меня есть главное окно с панелью инструментов и областью документов. Документы имеют привязки команд (например, Отменить и Повторить). Когда фокус клавиатуры находится за пределами документа, он не знает, как выполнить какую-либо из команд, поэтому кнопки становятся недоступными.

Что я хотел бы сделать, так это добавить механизм, посредством которого главное окно будет перенаправлять команды в активный документ (если он есть). Используя CommandManager.AddPreviewCanExecuteHandler, я могу получить события в главном окне, но не могу понять, как отправить их в дочерний документ - я попытался e.CanExecute = e.Command.CanExecute(CurrentDocument), но это просто заканчивается повторным вызовом PreviewCanExecuteHandler и CanExecute обработчик ребенка не вызывается.

Как я могу отправить произвольную команду ICom для дочернего элемента управления?

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Ответ здесь - позвоните CurrentDocument.RaiseEvent(e), убедившись, что это делается через обработчик, зарегистрированный в CommandManager.AddCanExecuteHandler (не AddPreviewCanExecuteHandler). И обязательно проверяйте бесконечную рекурсию.

0 голосов
/ 02 декабря 2011

Предположительно, у вас есть некоторый механизм управления активными документами - перечисление их, идентификация активного документа и т. Д.

Я предлагаю вместо того, чтобы думать о том, чтобы брать команды из главного окна и пересылать их в документ, думать о них как о том, что они берут команды, доступные в активном документе, и присоединяют их к главному окну.

Каким бы ни был ваш общий интерфейс среди документов, добавьте некоторые свойства:

ICommand Undo { get; }
ICommand Redo { get; }

Теперь вы будете привязывать элементы управления вашего главного окна к ActiveDocument.Undo и ActiveDocument.Redo, где ActiveDocument - это свойство в вашей модели представления основного окна. Когда ActiveDocument изменится, вы получите уведомление об изменении свойства, чтобы кнопки могли соответственно быть включены / отключены.

Между прочим, когда я делал подобное, я раскрываю некоторый составной объект, свойства которого ICommands являются свойствами, но с отдельными логическими свойствами CanUndo / CanRedo и другими метаданными - что дает мне более хорошую абстракцию для управления включением и отключением в зависимости от состояния стеков команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...