Как обрабатывать событие SelectionChanged для ComboBox с MVVM в wpf?
Как повысить/обработать событие SelectionChanged
WPF ComboBox
с использованием шаблона MVVM?
Объясните подробно, пожалуйста, я новичок в WPF.
Что я хочу, это сделать некоторые операции, когда выбор элемента ComboBox
изменился. Как я могу достичь этого, используя MVVM?
Ответы
Ответ 1
Решение MVVM:
Привяжите свойства ItemsSource
и SelectedItem
свойств ComboBox
к свойствам в ViewModel:
<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/>
В MainViewModel.cs:
public ObservableCollection<string> MyItems { get; set; }
private string _mySelectedItem;
public string MySelectedItem
{
get { return _mySelectedItem; }
set
{
// Some logic here
_mySelectedItem = value;
}
}
Решение для кода:
Если вы не хотите использовать MVVM, вы можете добавить это:
<ComboBox SelectionChanged="ComboBox_SelectionChanged" />
И добавьте это в MainWindow.xaml.cs:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Some logic here
}
Ответ 2
В вашей модели ViewModel необходимо реализовать 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"));
}
}
}
}
}
Ранее опубликованный XAML верен:
<ComboBox ItemsSource="{Binding MyItems}" SelectedItem="{Binding MySelectedItem}"/>
Ответ 3
Как сначала дайте понять, вы не можете изменить событие, а можете подписаться на него.
Поскольку вы не указали какую-либо информацию о том, откуда вы хотите обрабатывать изменения выбора, я рассмотрю наиболее распространенный сценарий - обработку в базовом ViewModel. Согласно MVVM ViewModel не должен ничего знать о View, поэтому вы не можете подписаться непосредственно с ViewModel на событие управления View. Но вы можете привязать свойство ViewModel к SelectedItem
или SelectedIndex
, чтобы оно срабатывало при изменении выбора.
<ComboBox
SelectedIndex="{Binding SelectedIndexPropertyName}"
... />
Существуют другие решения, выполняющие обработку кода, стоящего за View, обращаясь к ViewModel через view.DataContext
, но я бы посоветовал избежать такой практики, это работа вокруг случаев.
Ответ 4
Я большой поклонник этого метода.
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>