2009-08-26 9 views
2

Je travaille dans WPF en utilisant le pattern MVVM, et en général, les choses semblent bien fonctionner, car j'embrasse mon cerveau autour des nuances de WPF et de MVVM. Cependant, je suis actuellement bloqué sur un problème particulier. Mon application réelle est assez complexe, donc pour simplifier, prenons le near-defining article de Josh Smith sur le modèle et utilisons l'application qu'il contient.WPF: Evénement LostFocus sur un control/view/viewmodel particulier

Considérons la figure 2, et imaginons que l'utilisateur a tapé quelques trucs dans les champs prénom et nom de famille. Ensuite, l'utilisateur clique complètement hors de l'espace de travail (viewmodel), soit en cliquant sur un autre onglet client, soit éventuellement sur un modèle de vue complètement différent dans la même application. Dans ce cas, j'aimerais que l'application me demande «Hey, voulez-vous enregistrer vos modifications? Oui/Non/Annuler» et répondre de manière appropriée. Cela a présenté ... des défis. Parce que je voudrais que l'utilisateur puisse «annuler» ce premier passage suggère d'avoir besoin de PreviewLostKeyboardFocus (puisque je pourrais définir Handled = true et annuler le changement de focus). Cependant, plusieurs actions de l'utilisateur (par exemple cliquer sur l'onglet d'un espace de travail différent) ne modifient pas le focus du clavier. LostFocus me couvre mieux à cet égard, mais c'est seulement après que l'accent a déjà été perdu (bien que je puisse bien sûr le remettre en marche?) Et il y a des problèmes pour déterminer si l'événement venait de la vue elle-même l'ensemble de la vue) ou si elle est simplement bouillie à partir d'un objet contenu.

Et une grande image sur tout cela - cela semble être un problème pour la vue, mais cela implique l'écriture de code dans la vue plutôt que le mode de vue magique. Ce qui me fait penser que je ne regarde pas cela correctement. Donc, j'espère que je manque un grand a-ha conceptuel qui rendra tout cela clair. Aidez-moi?

Répondre

3

Vous devez vous concentrer sur votre modèle plutôt que sur votre vue. C'est-à-dire, quel change qui devrait déclencher votre logique? Dans ce cas, je dirais que c'est quand une tentative est faite pour changer l'onglet actif.

Vous avez donc besoin d'un modèle de vision d'ensemble dont les responsabilités sont les suivantes:

  • Expose une collection de tous les modèles de sous-vue (dont chacune apparaît dans son propre onglet)
  • Suivre l'actif (sélectionné) sous vue modèle (.-à-dire l'onglet actif)

Votre vue se lierait à ces propriétés de la manière habituelle:

<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"/> 

La propriété SelectedTab s'appliquerait votre logique comme suit:

  1. Est l'onglet courant sale?
  2. Si oui, demander à l'utilisateur via un service
  3. Si l'utilisateur annule, ne modifiez pas l'onglet actif
  4. Si l'utilisateur enregistre ou annule les modifications, puis modifiez l'onglet actif

I pense que la principale chose qui vous manque est le modèle de vue global. Travailler votre chemin à travers my ActiveAwareCommand sample project peut aider à augmenter votre compréhension.

+0

Le lien du blog est cassé – Eldho

Questions connexes