En el código siguiente, cuando el usuario selecciona Cliente en el cuadro combinado, el nombre del cliente se muestra en un cuadro de texto. Lleno el cuadro de Combox con una propiedad ObservableCollection en mi ViewModel, pero ¿cómo manejo el evento SelectedItem en mi ViewModel?¿Cuál es la forma más fácil de manejar el evento SelectedItem con MVVM?
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 encontrar la manera de conseguir que se disparan cuando "cuadro combinado selecciona un nuevo elemento".
Vista:
<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 subyacente:
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);
}
exactamente lo que estaba buscando, no sabía que era tan simple, gracias –
Solo recuerde que esto pone una dependencia entre su V/VM ... Si prueba este código sin la vista, ¡el cliente actualmente seleccionado nunca se actualizará! Si usa CollectionView ... ¡Funcionará incluso si su vista no vincula a la VM! – rudigrobler
En general, estoy de acuerdo en que hay ventajas en un CollectionView (aunque hay ciertas condiciones para vincular la misma lista a varios selectores), pero no creo que su comentario sea correcto. No hay más dependencia en mi versión que la suya, por ejemplo, si quería escribir una prueba para verificar que la propiedad LastName se actualiza correctamente, no necesito una vista, solo puedo configurar la propiedad SelectedCustomer a través del código de prueba. –