W poniższym kodzie, , gdy użytkownik wybierze Klienta w combobox, nazwa klienta zostanie wyświetlona w polu tekstowym pod numerem. Wypełniam pole Combox właściwością ObservableCollection na moim ViewModelu, ale jak mam obsłużyć zdarzenie SelectedItem w moim ViewModelu?Jaki jest najprostszy sposób obsługi zdarzenia SelectedItem z MVVM?
Łatwo to zaimplementować z kodem z tyłu, jak pokazano poniżej, ale jak to zrobić z wzorcem MVVM?
Obecnie mam DelegateCommand i AttachedBehaviors w moim podstawowego szablonu MVVM, że mogę wykorzystać, ale nie mogę dowiedzieć się, jak dostać się je do ognia, gdy „combobox wybiera nowy element”.
Widok:
<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>
Code Behind:
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);
}
dokładnie czego szukałem, nie wiedziałem, że to takie proste, dzięki –
Pamiętaj tylko, że to uzależnia twój V/VM ... Jeśli przetestujesz ten kod bez widok, aktualnieSelectedCustomer nigdy nie aktualizuje! Jeśli używasz CollectionView ... To zadziała, nawet jeśli twój widok nie przywróci VM! – rudigrobler
Ogólnie rzecz biorąc zgadzam się, że istnieją zalety CollectionView (chociaż są pewne zastrzeżenia, gdy chcesz powiązać tę samą listę z wieloma selektorami), ale nie sądzę, że twój komentarz jest poprawny. Nie ma więcej zależności w mojej wersji niż twoja, na przykład jeśli chciałem napisać test, aby sprawdzić, czy właściwość LastName jest aktualizowana poprawnie, nie potrzebuję widoku, mogę tylko ustawić właściwość SelectedCustomer poprzez kod testowy. –