Есть ли лучший способ, чем обработка CommandBindings в коде позади? - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть приложение, использующее MVVM. Я пытаюсь перехватить нажатие клавиш на пульте дистанционного управления MCE для воспроизведения, паузы, остановки и т. Д. В настоящее время я использую привязки команд с методом в коде, который выполняет связанное действие с элементом мультимедиа как таковое

<Window.CommandBindings>
    <CommandBinding Command="MediaCommands.Play" Executed="PlayMediaElement"/>
    <CommandBinding Command="MediaCommands.Stop" Executed="StopMediaElement"/>
</Window.CommandBindings>

Прежде чем пытаться включить функциональность пульта дистанционного управления, у меня было около 10 видов моделей / видов без кода. Мне интересно, есть ли лучший способ сделать это, чтобы я сохранил шаблон MVVM или это вполне приемлемо / предпочтительнее для реализации таким образом.

РЕДАКТИРОВАТЬ - я переместил привязки команд из UserControl внутри представления в мой MainWindow.xaml и поместил методы в MainWindow.xaml.cs. MainWindow не имеет отношения view / viewmodel, просто элемент управления контентом со связанной с ним ViewModel. В моих методах кода позади я использую посредник для отправки сообщений (Play, Pause, Stop и т. Д.) Моей модели mediaplayerview, которая, в свою очередь, взаимодействует с соответствующим представлением. Это хорошая идея или есть лучший способ?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Я думаю, что Джош Смит создал большую путаницу в своей статье 2009 года, когда отметил, что его файлы CS с выделенным кодом оставались в основном пустыми. MVVM не имеет ничего общего с кодом. Речь идет о разделении интересов. Если есть какое-то практическое правило, которому вы должны следовать, это сделать независимым представление ViewModel (т.е. нет ссылки из ViewModel на View. Подумайте о наличии второй реализации модульного теста для View для вашей ViewModel).

Эта путаница "без кода" привела к тому, что очень странные структуры просто работали вокруг проблемы, которой не должно было быть с самого начала.

Наличие кода в MainWindow.xaml.cs - вполне разумное решение, если у вас там нет логики, а просто перенаправьте вызов соответствующему методу в модели представления. Если бы это был мой код, я бы создал пользовательские команды (например, DelegateCommand из той же статьи), которые напрямую связываются с командами в ViewModel, но ваш дизайн также на 100% правомерен.

0 голосов
/ 23 февраля 2012

Зайдите на Codeplex.com и найдите Caliburn (или лучше Caliburn Micro). Он расширяет WPF, чтобы фактически разрешать вызов методов с произвольными параметрами, извлекаемыми из других объектов и метода, находящегося в модели / контроллере представления, без использования «метода ловушки» в коде позади простого перемещения вызова.

Расширения могут сделать чудесное извлечение значения текстового поля и передать его в качестве параметра методу, а затем отреагировать на возвращаемое значение - так же, как и представление.

Вы работаете с ограничением «стандартного» wpf, которое просто может указывать только на обработчики методов в коде без какого-либо отношения к параметрам. Существуют альтернативы, даже от Microsoft.

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