Question

Dans le code ci-dessous, lorsque l'utilisateur sélectionne le client dans la liste déroulante, le nom du client est affiché dans une zone de texte. Je remplis la zone Combox avec une propriété ObservableCollection sur mon ViewModel, mais comment puis-je gérer l'événement SelectedItem dans mon ViewModel?

Il est facile d'implémenter cela avec code-behind comme indiqué ci-dessous, mais comment procéder avec le modèle MVVM?

Je peux actuellement utiliser DelegateCommand et AttachedBehaviors dans mon modèle MVVM de base, mais je ne vois pas comment les déclencher lorsque la & combobox sélectionne un nouvel élément ".

Afficher:

<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 Derrière:

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);
}
Était-ce utile?

La solution

Vous devriez pouvoir lier une propriété dans ViewModel à la propriété SelectedItem de la liste déroulante. Si vous définissez cette liaison comme une liaison à double sens, vous serez averti lorsque l'élément sélectionné sera modifié, car il déclenchera la méthode set sur la propriété.

Modèle de vue:

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>

Autres conseils

Consultez la cette application sur le site www.codeproject.com. Ici, j'utilise CollectionView pour détecter l'élément actuellement sélectionné

Mettre à jour

Utilisation de CollectionView pour détecter l'élément sélectionné en cours

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

N'oubliez pas de définir également IsSynchronizedWithCurrentItem = " True "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top