WPF ComboBox SelectedItem - modifier la valeur précédente
J'ai un ComboBox qui a le SelectedItem lié au ViewModel.
<ComboBox SelectedItem="{Binding SelItem, Mode=TwoWay}" ItemsSource="{Binding MyItems}">
Lorsque l'utilisateur sélectionne un Élément dans la zone de liste déroulante Afficher, je veux afficher une invite de commandes et vérifier qu'ils veulent faire le changement.
Dans le SetItem le setter de la Propriété dans le Modèle de Vue, j'affiche une boîte de Dialogue pour confirmer la sélection. Quand ils disent oui, il fonctionne très bien.
Mon problème est que quand l'utilisateur clique sur "Non", je ne suis pas sûr de qui pour obtenir la zone de liste déroulante
pour revenir à la valeur précédente. La Propriété du ViewModel est correct
ancienne valeur, cependant, dans la Vue de la zone de liste déroulante affiche la nouvelle Valeur Sélectionnée.
Je veux à l'utilisateur de sélectionner un élément, vérifiez qu'ils veulent aller de l'avant avec elle, et si ils
décider de ne pas, je veux la zone de liste déroulante pour revenir à l'élément précédent.
Comment puis-je accomplir?
Merci!
Vous devez vous connecter pour publier un commentaire.
Lorsque l'utilisateur dit "non", WPF est pas au courant que la valeur a changé. Aussi loin que WPF est concerné, la valeur est ce que l'utilisateur a sélectionné.
Vous pouvez essayer d'augmenter un bien changé d'avis:
Le problème est, la notification de changement qui se passe dans le même contexte de l'événement de sélection. Ainsi, WPF l'ignore parce qu'il sait d'ores et déjà la propriété a changé à l'élément sélectionné par l'utilisateur!
Ce que vous devez faire est de soulever la notification de l'événement dans un autre message:
WPF va alors traiter ce message après c'est fait, le traitement de la sélection d'événements de changement et donc de rétablir la valeur dans la vue arrière de ce qu'elle devrait être.
Votre VM faudra bien évidemment l'accès à l'actuelle
Dispatcher
. Voir mon blog sur une base de classe VM si vous avez besoin de quelques conseils sur la façon de le faire.Merci pour cette question et les réponses. Le Répartiteur.BeginInvoke m'a aidé et a fait partie de ma dernière solution, mais la solution ci-dessus n'a pas bien fonctionné dans mon WPF 4 app.
J'ai mis en place un petit échantillon de comprendre pourquoi. J'ai dû ajouter du code qui a vraiment changé le sous-jacent membre de la valeur de la variable temporairement de sorte que lorsque WPF ré-interrogé de la lecture, on voit que la valeur de la chaned. Sinon, l'INTERFACE utilisateur n'a pas refléter correctement l'annulation et la BeginInvoke() l'appel n'a rien fait.
Voici un de mes post de blog avec mon exemple montrant un non-travail et un travail de mise en œuvre.
Mon setter fini par ressembler à ceci:
Une autre façon de faire (assurez-vous de lire aussi les commentaires):
http://amazedsaint.blogspot.com/2008/06/wpf-combo-box-cancelling-selection.html
À partir du lien:
Une autre solution pour la question de l'appel récursif de gestionnaire d'événements sans variable globale est d'annuler gestionnaire de cession avant le programmatique changement de sélection, et de réaffecter la suite.
Ex:
Ma façon de faire est de laisser le changement de passer et d'exécuter la validation dans un lambda qui est BeginInvoked dans le Répartiteur.
ou dans votre ViewModel: