10 Stimmen

Was ist der einfachste Weg, um SelectedItem Ereignis mit MVVM zu behandeln?

In dem unten stehenden Code, wenn der Benutzer Kunde auswählt in der Combobox, die der Name des Kunden wird angezeigt in einem Textfeld. Ich fülle das Feld Combox mit einer ObservableCollection-Eigenschaft auf meinem ViewModel, aber wie behandle ich das Ereignis SelectedItem in meinem ViewModel?

Es ist einfach, dies mit Code-Behind wie unten gezeigt zu implementieren, aber wie kann ich dies mit dem MVVM-Muster tun?

Ich habe derzeit DelegateCommand y AttachedBehaviors in meiner grundlegenden MVVM-Vorlage, die ich verwenden kann, aber ich kann nicht herausfinden, wie man sie zu feuern, wenn "Combobox ein neues Element auswählt" zu bekommen.

Ansicht:

<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);
}

12voto

Martin Harris Punkte 27587

Sie sollten in der Lage sein, eine Eigenschaft im ViewModel an die SelectedItem-Eigenschaft der Combobox zu binden. Wenn Sie dies als zweiseitige Bindung einrichten, werden Sie benachrichtigt, wenn die SelectedItem-Eigenschaft geändert wird, da dies die Set-Methode für die Eigenschaft auslöst.

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>

10voto

rudigrobler Punkte 16767

Werfen Sie einen Blick auf ce Anwendung auf www.codeproject.com. Hier verwende ich die CollectionView, um das aktuell ausgewählte Element zu erkennen

Update

Verwendung von CollectionView zur Erkennung des aktuell ausgewählten Elements

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

Denken Sie daran, auch IsSynchronizedWithCurrentItem="True" zu setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X