Comment gérer L'événement SelectionChanged de ComboBox avec MVVM dans wpf?

Comment soulever / gérer l'événement SelectionChanged de WPF ComboBox en utilisant le modèle MVVM?
Expliquez en détail s'il vous plaîtje suis nouveau à WPF.

Ce que je veux, c'est faire quelques opérations lorsque la sélection d'élément ComboBox a changé. Comment puis-je y parvenir, D'une manière MVVM?

25
demandé sur Athafoud 2011-12-29 13:53:43

4 réponses

Solution MVVM :

Liez les propriétés ItemsSource et SelectedItem du ComboBox aux propriétés de votre ViewModel:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/>

Dans MainViewModel.cs:

public ObservableCollection<string> MyItems { get; set; }

private string _mySelectedItem;
public string MySelectedItem
{
  get { return _mySelectedItem; }
  set
  {
    // Some logic here
    _mySelectedItem = value;
  }
}

Code-behind de la solution:

Si vous ne voulez pas utiliser MVVM, vous pouvez ajouter use this:

 <ComboBox SelectionChanged="ComboBox_SelectionChanged" />

Et ajoutez ceci dans MainWindow.XAML.cs:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Some logic here
}
41
répondu snurre 2011-12-29 10:20:51

Je suis un grand fan de cette méthode.

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

<ComboBox Grid.Column="2"  DisplayMemberPath="Data.name" ItemsSource="{Binding Model.Regions}" SelectedItem="{Binding Model.SelectedRegion}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding RegionChangedCmd}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>
7
répondu Blackey 2018-09-26 19:25:08

Votre ViewModel doit implémenter INotifyPropertyChanged.

public class MyViewModel : INotifyPropertyChanged
{
    private string _mySelectedItem;
    public string MySelectedItem
    {
        get
        {
            return _mySelectedItem;
        }
        set
        {
            if (_mySelectedItem != value)
            {
                _mySelectedItem = value;
                // Perform any pre-notification process here.
                if (null != PropertyChanged)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("MySelectedItem"));
                }
            }
        }
    } 
}

Le XAML précédemment affiché est correct:

<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/> 
6
répondu Steven Licht 2011-12-29 19:14:19

Comme nous allons d'abord faire les choses claires - vous ne pouvez pas changer l'événement plutôt que vous pouvez vous abonner.

Puisque vous n'avez fourni aucune information concernant l'endroit où vous voulez gérer les changements de sélection, je suppose que la gestion des scénarios la plus courante dans le ViewModel sous - jacent. Selon MVVM ViewModel ne devrait pas savoir quoi que ce soit sur View de sorte que vous ne pouvez pas vous abonner directement à partir de ViewModel à l'Événement du contrôle D'une vue. Mais vous pouvez lier une propriété de ViewModel à SelectedItem ou SelectedIndex donc cela déclencherait alors que la sélection change.

<ComboBox 
       SelectedIndex="{Binding SelectedIndexPropertyName}" 
       ... />

Il existe d'autres solutions qui gèrent le code derrière une vue en accédant à un ViewModel via view.DataContext mais je suggère d'éviter une telle pratique, ce sont des cas de contournement.

1
répondu sll 2011-12-29 10:02:47