Как вы обрабатываете 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

  1. Установите пакет Microsoft.Xaml.Behaviors.Wpf .

  2. Используйте пространство именxmlns:i="http://schemas.microsoft.com/xaml/behaviors"

  3. Тогда комобокс должен быть

      <ComboBox ItemsSource="{Binding Items}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

обратите внимание: в коде вообще нет никаких изменений, единственное, что нужно — это пакет Nuget и обновление пространства имен

Другие вопросы по тегам