Какой самый простой способ обработать событие SelectedItem с помощью MVVM?

StackOverflow https://stackoverflow.com/questions/1011750

  •  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".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top