36 votes

Comment gérer le SelectionChanged d'une ComboBox en MVVM ?

Pour ceux qui font du MVVM pur, comment gérer l'événement SelectionChanged d'une ComboBox sans revenir au code précédent ?

J'ai essayé par exemple AttachedBehaviors mais Event="SelectedChanged" n'est pas pris en charge :

<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>

85voto

fabien Points 393

Ce post est assez ancien, mais depuis j'ai eu le même problème. Voici comment je l'ai résolu (en utilisant le framework 4.0) : l'idée est d'utiliser System.Windows.Interactivity.

Dans le XAML :

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

Il vous suffit alors d'implémenter la SelectionChangedCommand dans votre viewmodel.

26voto

HAdes Points 4280

Je ne suis pas sûr que ce que vous recherchez soit possible, mais la façon dont je le fais est simplement de lier le SelectedItem à une propriété du modèle de vue. Ensuite, dans le setter de propriété, j'appelle tout code personnalisé que je souhaite voir se produire, c'est-à-dire la définition d'autres propriétés en fonction de la règle. Si j'ai besoin que l'élément sélectionné soit également lié à un objet (pour que les autres contrôles liés soient mis à jour), je le définis également dans le setter et j'envoie une notification.

3voto

Peter Points 1076

Vous utiliseriez un déclencheur de données pour déclencher un événement sur un élément différent de l'interface utilisateur, par exemple "activer/désactiver, ou visible/invisible".

Si vous voulez que l'élément sélectionné affiche les données de l'objet dans d'autres éléments de l'interface utilisateur, vous devez utiliser la liaison de données et définir le contexte de données des éléments d'affichage des données de l'interface utilisateur pour qu'il soit lié à l'élément actuellement sélectionné dans la liste déroulante.

1voto

Paul Points 1199

Solution .NET 4.0

Voir la réponse de Fabien ici

En outre, le kit SDK d'Expression Blend est nécessaire pour pouvoir utiliser l'outil de gestion de l'image. System.Windows.Interactivity espace de noms.

Il peut être téléchargé sur le site de Microsoft :

Expression Blend SDK pour .NET 4 (WPF)

Expression Blend SDK pour Silverlight 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X