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);
}
War es hilfreich?

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"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top