2009-08-26 12 views
2

Ich arbeite in WPF mit dem MVVM-Muster, und im Allgemeinen scheinen die Dinge ziemlich gut zu arbeiten, wie ich mein Gehirn um die Nuancen von WPF und MVVM wickeln. Ich bin jedoch momentan auf einem bestimmten Problem festgefahren. Meine eigentliche Anwendung ist ziemlich komplex, also nehmen wir einfach Josh Smiths near-defining article auf das Muster und verwenden Sie die Anwendung darin.WPF: LostFocus-Ereignis auf einem bestimmten Steuerelement/View/Viewmodel

Betrachten Sie Abbildung 2, und stellen Sie sich vor, dass der Benutzer in den Vor- und Nachnamen Felder eingegeben hat. Dann klickt der Benutzer vollständig vom Arbeitsbereich (Ansichtsmodell) weg, entweder durch Klicken auf eine andere Kundenregisterkarte oder möglicherweise ein völlig anderes Ansichtsmodell in derselben Anwendung. In diesem Fall möchte ich, dass die Anwendung fragt: "Hey, wollten Sie Ihre Änderungen speichern? Ja/Nein/Abbrechen" und entsprechend reagieren. Dies hat ... Herausforderungen dargestellt.

Da ich möchte, dass der Benutzer "abbrechen" kann, schlägt First-Pass vor, PreviewLostKeyboardFocus zu benötigen (da ich Handled = true festlegen und die Fokusverschiebung abbrechen konnte). Einige Benutzeraktionen (z. B. das Klicken auf die Registerkarte eines anderen Arbeitsbereichs) verschieben den Tastaturfokus jedoch nicht. LostFocus deckt mich in dieser Hinsicht besser ab, aber erst, nachdem der Fokus bereits verloren gegangen ist (obwohl ich natürlich zurückschalten könnte) und es gibt Probleme bei der Feststellung, ob das Ereignis von der Ansicht selbst stammt (dh wir gehen weg) die ganze Ansicht) oder wenn es einfach aus irgendeinem enthaltenen Objekt herausgeblasen wird.

Und ein großes Bild auf all dies - das scheint ein Problem für die Ansicht zu sein, aber dann bedeutet das Schreiben von Code in der Ansicht, anstatt das magische Viewmodel. Was mich denken lässt, dass ich das nicht richtig ansehe.

Also ich hoffe, ich vermisse einige große konzeptionelle a-ha, die das alles klar machen wird. Hilfe?

Antwort

3

Sie müssen sich auf Ihr Modell anstatt auf Ihre Sicht konzentrieren. Das heißt, was ändert sich das sollte Ihre Logik auslösen? In diesem Fall würde ich sagen, wenn versucht wird, den aktiven Tab zu ändern.

Sie müssen also eine übergeordnete Sicht Modell, dessen Aufgaben sind:

  • eine Sammlung aller Unter Ansicht Modelle Expose (von denen jede in einem eigenen Tab angezeigt wird)
  • Spur der aktiven (ausgewählten) Unteransicht Modell (. dh die aktive Registerkarte)

Ihre Ansicht dieser Eigenschaften auf die übliche Art und Weise binden würde:

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

Die SelectedTab Eigenschaft würde Ihre Logik gelten wie folgt:

  1. die aktuellen Tab verschmutzt ist?
  2. Wenn ja, fordert den Benutzer über einen Service
  3. Wenn der Benutzer abbricht,
  4. nicht die aktive Registerkarte ändern, wenn der Benutzer Änderungen gespeichert oder verworfen hat, dann ist die aktive Registerkarte

ich ändern Denken Sie, das Wichtigste, was Sie vermissen, ist das übergeordnete Ansichtsmodell. Arbeiten Sie Ihren Weg durch my ActiveAwareCommand sample project kann dazu beitragen, Ihr Verständnis zu erhöhen.

+0

Der Blog-Link ist kaputt – Eldho

Verwandte Themen