2017-01-31 12 views
4

Я борюсь с MVVM в своем приложении. У меня есть TabControl, у каждой вкладки есть элемент управления, который позволяет каким-то образом редактировать файл. Например, текстовые файлы или изображения. Каждый элемент управления привязан к классу из области ViewModel (как показано на диаграмме). У меня также есть RoutedUICommands. Одна из этих команд - WordWrap и имеет смысл только в случае текстовых файлов. Эта команда используется в MenuItem или Button и т. Д. Я бы хотел включить ее только в том случае, если целью этой команды является текстовое управление. Как это сделать в соответствии с MVVM?RoutedUICommand в MVVM

Подробнее:

diagram image

XAML для окна имеет:

пункт
<Window.CommandBindings> 
<CommandBinding Command="local:EditorCommands.WordWrap" 
    Executed="WordWrapExecuted" 
    CanExecute="CommandCanBeExecutedWhenAnythingIsOpen"/> 
</Window.CommandBindings> 

меню используется следующим образом:

<MenuItem Command="local:EditorCommands.WordWrap"/> 

Первая вещь Выполненный и обработчики событий CanExecute: они находятся в классе Window, хотя мой недостаток Если MVVM, то логика должна быть только в ViewModel.

Более того, отправитель в этой функции является экземпляром окна. Почему это не цель команды?

Должен ли я писать своих собственных последователей RoutedUICommand для каждой команды?

ответ

1

RoutedUICommand не очень подходят для использования в модели представления, как он ищет визуальное дерево из сфокусированного элемента и выше для элемента, который имеет соответствующий System.Windows.Input.CommandBinding объект в его коллекции CommandBindings, а затем выполняет Execute делегата для этого особенно CommandBinding.

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

Вместо этого вы должны создать собственную реализацию интерфейса ICommand или использовать тот, который доступен в любой из инфраструктур MVVM. Например, MvvmLight имеет класс RelayCommand: https://msdn.microsoft.com/en-us/magazine/dn237302.aspx.

How to use RelayCommand with the MVVM Light framework

И Prism это называется DelegateCommand: https://www.codeproject.com/Articles/1055060/DelegateCommand-and-CompositeCommand-in-Prism

Пожалуйста, обратитесь к следующему сообщению в блоге для получения дополнительной информации о командах в MVVM: https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/