Как вы обрабатываете ComboBox SelectionChanged в MVVM? - PullRequest
31 голосов
/ 04 июня 2009

Для тех, кто делает чистый 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>

Ответы [ 3 ]

66 голосов
/ 29 апреля 2011

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

26 голосов
/ 09 сентября 2009

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

3 голосов
/ 04 июня 2009

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

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

...