Я надеюсь, что кто-то может помочь.
Я потратил некоторое время на изучение лучшего способа привязки события к команде 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.
Тем не менее, мои вопросы по-прежнему стоят: Почему не работает InvokeActioncommand
и почему это бросает указанную ошибку? Я буду смотреть на другие сообщения, как только я получу работу.
Обновление 2 После тестирования этого на моих персональных компьютерах (точно такой же код, как указано выше, 1-й пример и тот же SDK поведения) он отлично работает, и я получаю поведение, которого я ожидал бы. Мне нужно снова протестировать мой домашний компьютер, чтобы увидеть, что пошло не так. (Спасибо Джастину XL за то, что я придерживаюсь)
Обновление 3 Для полноты, после возвращения домой, я получил последнюю версию моего проекта (от проверки на моем рабочем ПК), и теперь он также работает на моем домашнем ПК. Я не уверен, в каком состоянии была моя Visual Studio, но я достаточно смутил меня, чтобы опубликовать этот вопрос. По крайней мере, это должно служить документом о том, как сделать то, что описано в названии. Спасибо за вашу помощь.