Как связать событие с командой в универсальном приложении с использованием шаблона MVVM?

Я надеюсь, что кто-то может помочь.

Я потратил некоторое время на изучение лучшего способа привязки события к команде ViewModel с использованием шаблона MVVM при разработке универсального приложения. Я использую MVVM Light. В качестве теста я использую событие SelectionChanged для ComboBox.

Я прочитал несколько человек, которые ущипнули SDK Behaviors от платформы Windows 8.1/WinRT и имели некоторый успех. Я также включил SDK для всех приложений в свой проект и попробовал следующее (составлен из примеров Windows 8.1, но с использованием UWP SDK).

XAML

<Page
   xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
   xmlns:core="using:Microsoft.Xaml.Interactions.Core" />
...
<ComboBox ItemsSource="{Binding InputQuantities}">
   <interactivity:Interaction.Behaviors>
      <core:EventTriggerBehavior EventName="SelectionChanged">
         <core:InvokeCommandAction Command="{Binding SomeComboBoxCommand}" CommandParameter="Foo" />
      </core:EventTriggerBehavior>
   </interactivity:Interaction.Behaviors>
</ComboBox>

Показать модель

public RelayCommand SomeComboBoxCommand {get; set;}

Однако ядро: InvokeCommandAction не является частью SDK Behaviors, и я получаю Invalid Type: ожидаемый тип - это "Microsoft.Xaml.Interactivity.ActionCollection". Я попытался использовать ActionCollection.... но я не уверен, что знаю, что я делаю с этим.

Ive успешно получил его для работы с скомпилированными привязками и с помощью Laurent Сообщение в блоге:

XAML

<ComboBox ItemsSource="{Binding InputQuantities}" SelectionChanged="{x:Bind Vm.SomeComboBoxCommand }" />

Показать модель

public void SomeComboBoxCommand(object sender, SelectionChangedEventArgs e){//do stuff}

Я знаю, что это не то, что Laurent намеревается продемонстрировать здесь, и я думаю, что это нарушает развязку представления и VM, а затем ссылается на компонент пользовательского интерфейса в моей модели представления, чтобы получить выбранный элемент. Но я видел ссылки на это во время моих исследований.

Итак, как я могу заставить это работать с использованием поведения взаимодействия с Universal App, если это правильный способ сделать это, конечно?

Обновить 1. Это то, что я попытался добавить, полагая, неправильно, что добавляю универсальный SDK поведения приложений. В то время я не заметил, что он нацелен на Windows 8.1. Behaviors SDK

Тем не менее, мои вопросы по-прежнему стоят: Почему не работает InvokeActioncommand и почему это бросает указанную ошибку? Я буду смотреть на другие сообщения, как только я получу работу.

Обновление 2 После тестирования этого на моих персональных компьютерах (точно такой же код, как указано выше, 1-й пример и тот же SDK поведения) он отлично работает, и я получаю поведение, которого я ожидал бы. Мне нужно снова протестировать мой домашний компьютер, чтобы увидеть, что пошло не так. (Спасибо Джастину XL за то, что я придерживаюсь)

Обновление 3 Для полноты, после возвращения домой, я получил последнюю версию моего проекта (от проверки на моем рабочем ПК), и теперь он также работает на моем домашнем ПК. Я не уверен, в каком состоянии была моя Visual Studio, но я достаточно смутил меня, чтобы опубликовать этот вопрос. По крайней мере, это должно служить документом о том, как сделать то, что описано в названии. Спасибо за вашу помощь.

Ответ 1

Кажется, мы очень часто задаем этот вопрос в нескольких разных вариантах...

Я не знаком с Universal App, но есть ли какая-то конкретная причина, по которой вы пытаетесь использовать событие? WPF/Silverlight и т.д. Предназначены для управления данными, все, что вам нужно сделать, - связать член ComboBox SelectedItem с свойством в вашей модели представления, и сеттер будет вызван всякий раз, когда пользователь выбирает новый элемент. Часто вам приходится делать точно такую ​​же обработку в ответ на другие части вашей модели представления, меняющие ее (например, в представлениях "Мастер-ребенок" ), поэтому такая логика в одном месте обычно делает более чистую архитектуру.

Ответ 2

Проверьте эту ссылку: MVVM EventBinding Library, объясняет MVVM EventBinding. Это чисто отделяет модель View и View и передает только аргументы команды.