web-dev-qa-db-fra.com

Comment gérez-vous un ComboBox SelectionChanged dans MVVM?

Pour ceux qui font de la MVVM pure, comment gérez-vous un événement ComboBox SelectionChanged sans revenir au code derrière?

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>
31
Edward Tanguay

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

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

3
Peter

Ce message 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 ensuite d'implémenter SelectionChangedCommand dans votre viewmodel.

67
fabien

Je ne sais pas si ce que vous recherchez est possible, mais la façon dont je le fais est simplement de lier le SelectedItem à une propriété sur le modèle de vue. Ensuite, dans le configurateur de propriétés, j'appelle n'importe quel code personnalisé que je veux obtenir, c'est-à-dire en définissant 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 d'autres contrôles liés soient mis à jour), je le définis également dans le setter et j'envoie une notification.

26
HAdes