Was ist der einfachste Weg SelectedItem Ereignis mit MVVM zu behandeln?
-
06-07-2019 - |
Frage
In dem folgenden Code, , wenn der Benutzer Kunden wählt in der Combobox, die Kundenname angezeigt wird in einer Textbox. Ich fülle die Combox-Box mit einer ObservableCollection-Eigenschaft auf meinem Viewmodel aber wie gehe ich mit dem SelectedItem Ereignisse in meinem Viewmodel?
Es ist einfach, dies mit Code-behind zu implementieren, wie unten gezeigt, aber wie mache ich das mit dem MVVM Muster?
Im Moment habe ich DelegateCommand und AttachedBehaviors in meinem Grunde MVVM Vorlage, die ich verwenden kann, aber ich kann nicht herausfinden, wie man sich feuern, wenn „Combobox wählt ein neues Element“.
:
<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);
}
Lösung
Es sollte möglich sein, eine Eigenschaft zu binden, in denen Sie die SelectedItem-Eigenschaft der ComboBox Ansichtsmodell. Wenn Sie dies als Zweiweg einrichten verbindlich werden Sie benachrichtigt, wenn die SelectedItem geändert wird, weil es die Set-Methode auf dem Grundstück auslösen.
Ansichtsmodell:
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>
Andere Tipps
Hier finden Sie aktuelle dieser Anwendung auf www.codeproject.com. Hier verwende ich die Collection das aktuell ausgewählte Element zu erkennen
Aktualisieren
Collection Mit den aktuellen ausgewählten Elements erkennen
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers);
view.CurrentChanged += delegate
{
SelectedCustomer= (Customer)view.CurrentItem;
};
Denken Sie daran, auch gesetzt IsSynchronizedWithCurrentItem = "True"