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

person Edward Tanguay    schedule 04.06.2009    source источник


Ответы (3)


Вы должны использовать триггер данных для запуска события в другом элементе пользовательского интерфейса, таком как «включить / отключить или видимый / невидимый».

Если вы хотите, чтобы выбранный элемент отображал данные объекта в других элементах пользовательского интерфейса, вы должны использовать привязку данных и установить привязку контекста данных элементов отображения данных пользовательского интерфейса к текущему выбранному элементу в поле со списком.

person Peter    schedule 04.06.2009
comment
хорошо, я мог бы сделать это, если все, что я хочу сделать, это изменить XAML, но что, если я хочу, например, используйте поле со списком для выполнения кода, который делает то, что XAML не может сделать, например. загрузить новый файл ресурсов и прикрепить его к текущему окну? или например изменить некоторые данные в базе данных и т.д. - person Edward Tanguay; 04.06.2009
comment
Затем вы можете использовать привязку вашей модели представления к полю со списком SelectionChanged. Я не уверен, где бы вы искали пример, но Карл Шиффлет и Джош Смит — два основных блога, в которые я обращаюсь за помощью по MVVM. Ссылки на их блоги приведены ниже. karlshifflett.wordpress.com/2009/06/03 / joshsmithonwpf.wordpress.com/2009/05/20/ Извините, я не могу больше рассказать о специфике, я сам новичок в WPF и MVVM. - person Peter; 05.06.2009
comment
к сожалению, забыл упомянуть, что Карл Шиффлет проводит много мероприятий WPF Line OF Business, поищите их в своем блоге, они содержат несколько отличных примеров в Powerpoint и образцы кода. - person Peter; 05.06.2009

Этот пост довольно старый, но так как у меня возникла такая же проблема. Вот как я это решил (используя 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 в вашей модели представления.

person fabien    schedule 28.04.2011
comment
Также есть CallMethodAction, если вам не нужен Command, хотя для этого требуется добавить ссылку на Microsoft.Expression.Interactions.dll - person markmnl; 19.03.2014
comment
и как бы вы связали SelectedItem или SelectedValue из ComboBox здесь, не дав ему имя? - person Maslow; 20.01.2017
comment
@Maslow или кто-либо еще, желающий передать выбранный элемент в качестве параметра: используйте привязку, см. здесь. В моем случае я назвал ComboBox, например, MyCombo, а затем привязка была простой {Binding ElementName=MyCombo, Path=SelectedItem}. - person Paul; 10.10.2017
comment
После добавления ссылки на System.Windows.Interactivity вам нужно добавить это пространство имен в заголовок XAML: xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity". - person Beauty; 10.07.2018
comment
для ядра .net вам понадобится этот nuget: https://github.com/Microsoft/XamlBehaviorsWpf. Добавьте в XML-файл макета окна следующее: <Window/> -› xmlns:i="http://schemas.microsoft.com/xaml/behaviors" Подробнее об этом: здесь - person S0und; 23.01.2020

Я не уверен, возможно ли то, что вам нужно, но я просто привязываю SelectedItem к свойству в модели представления. Затем в установщике свойств я вызываю любой пользовательский код, который я хочу выполнить, т. е. устанавливаю другие свойства на основе правила. Если мне нужно, чтобы выбранный элемент также был привязан к объекту (для обновления других связанных элементов управления), я также устанавливаю это в установщике и отправляю уведомление.

person HAdes    schedule 09.09.2009
comment
Я думаю, что этот способ имеет наибольший смысл, и пока он хорошо работает для меня. Спасибо, что опубликовали это. - person Aphex; 15.07.2011
comment
Я считаю, что это невероятно болезненный способ сделать это. Для простых приложений это легко сделать вместо команды. Но быстро становится громоздким. Свойства должны хранить данные, а не выполнять действия. Это нарушает асинхронность и затрудняет отладку, поскольку Visual Studio по умолчанию обходит методы установки/получения свойств. - person Richard June; 19.10.2016