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?
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
}
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>
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}"/>
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.