Quel est le moyen le plus facile pour gérer SelectedItem événement avec MVVM?
Dans le code ci-dessous, lorsque l'utilisateur sélectionne Client dans la zone de liste déroulante, le nom du client est affiché dans une zone de texte. Je remplis le Combox boîte avec une ObservableCollection bien sur mon ViewModel, mais comment dois-je traiter la SelectedItem événement dans mon ViewModel?
Il est facile à mettre en œuvre des ce avec le code-behind, comme indiqué ci-dessous, mais comment puis-je faire cela avec le modèle MVVM?
J'ai actuellement DelegateCommand et AttachedBehaviors dans ma base de MVVM modèle que je peux utiliser, mais je ne peux pas comprendre comment les obtenir à feu lors de la "zone de liste déroulante sélectionne un nouvel élément".
Vue:
<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);
}
OriginalL'auteur Edward Tanguay | 2009-06-18
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de lier une propriété dans vous ViewModel de la propriété SelectedItem de la zone de liste déroulante. Si vous définissez cette place comme une liaison bidirectionnelle, vous serez notifié lors de l'SelectedItem est modifié, car il va déclencher la méthode de jeu sur la propriété.
ViewModel:
Xaml:
Rappelez-vous juste que cela met une dépendance entre votre V/VM... Si vous testez ce code, sans la vue, l'CurrentlySelectedCustomer ne sera jamais mise à jour! Si vous utilisez le CollectionView... Il fonctionne même si votre avis ne lient pas le dos à la VM!
En général je suis d'accord il y a des avantages à un CollectionView (bien qu'il existe certaines conditions quand vous voulez lier la même liste à plusieurs sélecteurs), mais je ne pense pas que votre commentaire est correct. Il n'y a plus de dépendance dans ma version que le vôtre, par exemple, si je voulais écrire un test pour vérifier que le Nom de la propriété des mises à jour correctement je n'ai pas besoin d'un avis, je peux juste mettre le SelectedCustomer bien par le code de test.
D'accord... les deux vont vraiment travailler! Le seul autre problème que je peux voir, c'est que si vous voulez utiliser un deffirent vue... vous devez n'oubliez pas de lier à l'élément sélectionné! Mon approche est similaire de problème parce que, à mon avis, vous devez n'oubliez pas de définir le IsSyncronizedWithCurrent pour vrai! J'ai définitivement comme votre sulotion et, dans certains cas, il mettra un travail que je n'aime pas être dépendante de la vue... à l'Aide de la CV est juste un peu plus de couplés à!
OriginalL'auteur Martin Harris
Ont un coup d'oeil à cette application sur http://www.codeproject.com. J'utilise ici la CollectionView pour détecter l'élément actuellement sélectionné
Mise à jour
À l'aide de CollectionView pour détecter le courant de l'élément sélectionné
Juste n'oubliez pas aussi de définir IsSynchronizedWithCurrentItem="True"
IsSynchronizedWithCurrentItem="True"
. Après une heure à essayer de comprendre pourquoiCurrendChanged
n'a jamais été déclenché dans mon code que vous avez sauvé la journée.OriginalL'auteur rudigrobler