Как вы обрабатываете ComboBox SelectionChanged в MVVM?
Для тех, кто делает чистый MVVM, как вы обрабатываете событие ComboBox SelectionChanged, не возвращаясь к коду?
Я пробовал, например, AttachedBehaviors, но Event="SelectedChanged" не поддерживается:
<ComboBox>
<ComboBoxItem Content="Test1">
<c:CommandBehaviorCollection.Behaviors>
<c:BehaviorBinding Event="SelectionChanged"
Command="{Binding SelectedChanged}"
CommandParameter="MainBorder123"/>
</c:CommandBehaviorCollection.Behaviors>
</ComboBoxItem>
<ComboBoxItem Content="Test2"/>
<ComboBoxItem Content="Test3"/>
</ComboBox>
4 ответа
Вы бы использовали триггер данных для запуска события в другом элементе пользовательского интерфейса, таком как "включить / отключить или видимый / невидимый"
Если вы хотите, чтобы выбранный элемент отображал данные объекта в других элементах пользовательского интерфейса, вы должны использовать привязку данных и установить текстовый текст данных элементов отображения данных пользовательского интерфейса для привязки к текущему выбранному элементу в поле со списком.
Этот пост довольно старый, но так как я получил ту же проблему. Вот как я это решил (используя framework 4.0): идея в том, чтобы использовать System.Windows.Interactivity.
В XAML:
<ComboBox ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
Тогда вам просто нужно реализовать SelectionChangedCommand в вашей модели представления.
Я не уверен, что то, что вам нужно, возможно, но способ, которым я это делаю, - это просто привязать SelectedItem к свойству в модели представления. Затем в установщике свойств я вызываю любой пользовательский код, который хочу выполнить, т.е. устанавливаю другие свойства на основе правила. Если мне нужно, чтобы выбранный элемент также был привязан к объекту (для обновления других связанных элементов управления), я также устанавливаю это в установщике и отправляю уведомление.
Для более новых версий WPF
Установите пакет Microsoft.Xaml.Behaviors.Wpf .
Используйте пространство имен
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
Тогда комобокс должен быть
<ComboBox ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
обратите внимание: в коде вообще нет никаких изменений, единственное, что нужно — это пакет Nuget и обновление пространства имен