Какой самый простой способ обработать событие SelectedItem с помощью MVVM?
-
06-07-2019 - |
Вопрос
В приведенном ниже коде, когда пользователь выбирает Клиента в выпадающем списке отображается имя клиента в текстовом поле.Я заполняю поле Combox свойством ObservableCollection в моей ViewModel, но как мне обработать событие SelectedItem в моей ViewModel?
Это легко реализовать с помощью встроенного кода, как показано ниже, но как мне сделать это с помощью шаблона MVVM?
В настоящее время у меня есть Делегатская команда и Прикрепленные к поведению в моем базовом шаблоне MVVM, который я могу использовать, но я не могу понять, как заставить их срабатывать, когда "combobox выбирает новый элемент".
Вид:
<Window.Resources>
<DataTemplate x:Key="CustomerTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<DockPanel LastChildFill="False" Margin="10">
<ComboBox
x:Name="CustomerList"
ItemTemplate="{StaticResource CustomerTemplate}"
HorizontalAlignment="Left"
DockPanel.Dock="Top"
Width="200"
SelectionChanged="CustomerSelected"
ItemsSource="{Binding Customers}"/>
<TextBlock x:Name="CurrentlySelectedCustomer"/>
</DockPanel>
Код, Стоящий за:
private void CustomerSelected(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
Customer customer = (Customer)CustomerList.SelectedItem;
CurrentlySelectedCustomer.Text = String.Format("{0} {1}", customer.FirstName, customer.LastName);
}
Решение
Вы должны иметь возможность привязать свойство в вашей ViewModel к свойству SelectedItem в combobox.Если вы настроите это как двустороннюю привязку, вы будете уведомлены об изменении SelectedItem, потому что это вызовет метод set для свойства.
Видовая модель:
public ObservableCollection Customers
{
get { return _customers; }
set
{
if (_customers != value)
{
_customers = value;
OnPropertyChanged("Customers");
}
}
}
public Customer SelectedCustomer
{
get { return _selectedCustomer; }
set
{
if (_selectedCustomer != value)
{
_selectedCustomer= value;
LastName= value.LastName;
OnPropertyChanged("SelectedCustomer");
}
}
}
public Customer LastName
{
get { return _lastName; }
set
{
if (_lastName!= value)
{
_lastName= value;
OnPropertyChanged("LastName");
}
}
}
Xaml:
<DockPanel LastChildFill="False" Margin="10">
<ComboBox
x:Name="CustomerList"
ItemTemplate="{StaticResource CustomerTemplate}"
HorizontalAlignment="Left"
DockPanel.Dock="Top"
Width="200"
SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"
ItemsSource="{Binding Customers}"/>
<TextBlock x:Name="CurrentlySelectedCustomer"
Text="{Binding LastName}"/>
</DockPanel>
Другие советы
Взгляните на это приложение включено www.codeproject.com.Здесь я использую CollectionView для определения выбранного в данный момент элемента
Обновить
Использование CollectionView для определения текущего выбранного элемента
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers);
view.CurrentChanged += delegate
{
SelectedCustomer= (Customer)view.CurrentItem;
};
Просто не забудьте также установить IsSynchronizedWithCurrentItem="True".