none
MVVM: Ereignis aus XAML direkt an ViewModel binden RRS feed

  • Frage

  • Hi @all,
    wie kann man ein Ereignis im XAML direkt (ohne Codebihind) an das als Resource gebundene ViewModels durchreichen? Wie kann der XAML-Code und der Code im ViewModel aussehen?

    Daraus ergibt sich eine weitere Frage: Wie kann man beispielsweise ein StoryBoard aus dem ViewModel steuern? Zustandsänderungen im ViewModel sollen ein StoryBoard starten und das Complete-Ereignis soll Aktivitäten im ViewModel anstoßen.

    Hat dazu jemand ein Beispiel?

    Vielen Dank

    --
    Peter
    Montag, 1. März 2010 23:52

Alle Antworten

  • Hallo Peter,

    wenn du nur StoryBoards steuern willst, dann schau dir den Thread von Olaf und seinem animierten TabControl an.

    http://social.msdn.microsoft.com/Forums/en-US/wpfde/thread/633f1f52-0e5a-4d47-ba0e-05627d5b2b17

    Er startet und stoppt die Animationen, wenn sich Properties ändern. Du könntest versuchen ein gebundens Property des ViewModels dazu zu verwenden.
    Dienstag, 2. März 2010 22:53
  • Hallo Günter,
    vielen Dank für die Antwort. Ich konnte sie aber leider nicht umsetzen.

    In Olafs Lösung starten die Timelines der Storyboards durch Eventtrigger, die die Ereignisbedingungen aus den Eigenschaften von UI-Elementen holen.

    Was ich wünsche, ist die Binding von BeginStoryboard an eine Eigenschaft/Ereignis aus einem fremden Objekt (z.B. ViewModel) und auch den umgekehrten Weg, die Übertragung der Endemeldung (myStoryboard.Completed) zum fremden Objekt (ViewModel), ohne extra im Codebehind zu programmieren, so, wie es im MVVM pattern praktiziert wird.

    Ich versuche gerade, vom Storyboard zu erben, um eine zusätzliche Eigenschaft (z.B. IsActive) einzubauen, die beim Setzen auf True das Storyboard startet (myStoryboard.Begin) und zm Ende (myStoryboard.Completed) den Eigenschaftswert wieder auf False setzt. Solch eine Eigenschaft könnte man dann direkt an eine Eigenschaft im ViewModel binden. Vielleicht gelingt es mir so, obwohl mir eine direkte Lösung ohne Vererbung lieber wäre.

    --
    Peter

    Ergänzung:

    Die Bindung einer Eigenschaft, die bei Veränderung das Storybord startet, habe ich hinbekommen. Die Lösung ist ein DataTrigger (funktionert plötzlich :-). Auch komme ich das Completed-Ereignis des Storyboards mittels Attached Behaviour ran.

    Was mir bisher nicht gelungen ist, ist der Zugriff auf das Datenobjekt, also folgendes:

    - Eigenschaft aus ViewModel ist an DataTrigger gebunden.
    - Storyboard ist unter DataTrigger eingebettet.
    - Completed-Ereignis bringt im Sender in der statischen Methode den Verweis auf das Storyboard-Objekt.

    Wie komme ich jetzt in der statischen (Complete)-Methode zum Objektverweis meines ViewModels, um dort wieder auf die an den DataTrigger gebundene Eigenschaft zugreifen zu können? Ich müsste mich also vom Storyboard nach oben bis zum DataTriger bewegen, um dort auf die Property oder auch irgendwo auf den DataContext zuzugreifen.

    --
    Peter
    Mittwoch, 3. März 2010 21:20