Pregunta

En el siguiente código, cuando el usuario selecciona Cliente en el cuadro combinado, se muestra el nombre del cliente en un cuadro de texto. Completo el cuadro Combox con una propiedad ObservableCollection en mi ViewModel, pero ¿cómo manejo el evento SelectedItem en mi ViewModel?

Es fácil implementar esto con código subyacente como se muestra a continuación, pero ¿cómo hago esto con el patrón MVVM?

Actualmente tengo DelegateCommand y AttachedBehaviors en mi plantilla MVVM básica que puedo usar, pero no puedo entender cómo hacer que se activen cuando " combobox selecciona un nuevo elemento " ;.

View:

<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>

Código detrás:

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);
}
¿Fue útil?

Solución

Debería poder vincular una propiedad en su ViewModel a la propiedad SelectedItem del cuadro combinado. Si configura esto como enlace bidireccional, se le notificará cuando se cambie SelectedItem porque activará el método establecido en la propiedad.

ViewModel:

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>

Otros consejos

Eche un vistazo a esta aplicación en www.codeproject.com. Aquí utilizo CollectionView para detectar el elemento seleccionado actualmente

Actualizar

Uso de CollectionView para detectar el elemento seleccionado actual

ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers); 
view.CurrentChanged += delegate 
{ 
    SelectedCustomer= (Customer)view.CurrentItem; 
};

Solo recuerda configurar también IsSynchronizedWithCurrentItem = " True "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top