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


Comment élever / manipuler le SelectionChanged événement de WPF ComboBox en utilisant le pattern MVVM?
Expliquez en détail s'il vous plaît je suis nouveau à WPF.

Ce que je veux, c'est faire des opérations quand le ComboBox la sélection des articles a changé. Comment puis-je y parvenir, de manière MVVM?


23
2017-12-29 09:53


origine


Réponses:


Solution MVVM:

Lier le ItemsSource et SelectedItem propriétés 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;
  }
}

Solution code-behind:

Si vous ne souhaitez pas utiliser MVVM, vous pouvez ajouter ceci:

 <ComboBox SelectionChanged="ComboBox_SelectionChanged" />

Et ajoutez ceci dans MainWindow.xaml.cs:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Some logic here
}

40
2017-12-29 10:14



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 posté est correct:

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

6
2017-12-29 18:12



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:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding RegionChangedCmd}" />
    </i:EventTrigger>
</ComboBox>

4
2017-09-14 20:58



Tout d'abord, mettons les choses au clair - vous ne pouvez pas changer d'événement mais vous pouvez vous y abonner.

Comme vous n'avez fourni aucune information sur l'endroit où vous souhaitez gérer les modifications de sélection, je suppose que le scénario le plus courant est la gestion dans ViewModel sous-jacent. Selon MVVM, ViewModel ne devrait rien savoir de View, vous ne pouvez donc pas vous abonner directement à ViewModel à l'événement du contrôle View. Mais vous pouvez lier une propriété de ViewModel à SelectedItem ou SelectedIndex il se déclencherait alors que la sélection change.

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

Il existe d’autres solutions pour manipuler le code derrière une vue en accédant à un ViewModel via view.DataContext mais je suggère d'éviter de telles pratiques, ce sont des travaux autour des cas.


1
2017-12-29 09:56