none
Multithreading und DataBinding (MVVM-Pattern) RRS feed

  • Frage

  • Hallo,

    ich versuche anhand eines Beispielprojekt das MVVM-Pattern umzusetzen. Hierbei wird ja stark von DataBinding gebrauch gemacht, bzw. in den Controls soll gar kein "CodeBehind" mehr sein. Jetzt treffe ich auf das Problem, dass bei asnychronen PropertyChanged Events Exceptions ausgelöst werden, da ja die GUI-Elemente nur aus dem Hauptthread aktualisiert werden können. Das Binding reagiert aber auf das PropertyChangedEvent der Model-Klasse aus dem Hintergrunthread.

    Bei manuellem Update der Control-Werte über normalen Code (also kein DataBinding), ist es ja kein Problem, das mit dem Dispatcher zu lösen. Gibt es bei dem MVVM-Pattern und DataBinding eine Möglichkeit das Binding Thread-Safe einzustellen (z.B. eine Art "BindWithDispatcherInvoke"-Property)?

    Wie kann man sonst das MVVM-Pattern bzw. DataBinding mit Backgroundthreads nutzen?

     

    Dienstag, 16. August 2011 08:54

Antworten

  • Ich löse die Parallelarbeit mit dem BackgroundWorker, z.B. so:
     
    1. Bei komplexer Bindung wird die Oberfläche gebunden an eine Eigenschaft vom Typ ICollectionView, z.B. “View”.
    2. Beim Lesen (Getter) in der Eigenschaft (“View”) wird geprüft, ob die Daten schon da sind (z.B. if tab is nothing)
    3. Wenn die Daten noch nicht da sind, dann wird die Lade-Methode aufgerufen
    4. Danach wird die Sicht einer CollectionViewSource für die Anzeige bereitgestellt (CollectionViewSource.View). Wenn die Daten noch nicht da sind, wird halt Nothing geliefert und nix angezeigt.
     
    5. Die Lade-Methode startet den BackgroundWorker
    6. Der Backgroundworker führt asynchron das Laden der Daten aus und meldet das Ende über das RunWorkerCompleted-Ereignis.
    7. In der RunWorkerCompleted-Ereignisroutine werden die geladenen Daten der CollectionViewSource zugewiesen und ein PropertChanged für die Sicht (“View”) ausgelöst.
    8. Die Oberfläche fragt wieder bei der Sicht (“View”) an und bekommt dieses Mal eine gefüllte Sicht.
     
     
    --
    Viele Gruesse
    Peter
    Dienstag, 16. August 2011 11:44

Alle Antworten

  • Ich löse die Parallelarbeit mit dem BackgroundWorker, z.B. so:
     
    1. Bei komplexer Bindung wird die Oberfläche gebunden an eine Eigenschaft vom Typ ICollectionView, z.B. “View”.
    2. Beim Lesen (Getter) in der Eigenschaft (“View”) wird geprüft, ob die Daten schon da sind (z.B. if tab is nothing)
    3. Wenn die Daten noch nicht da sind, dann wird die Lade-Methode aufgerufen
    4. Danach wird die Sicht einer CollectionViewSource für die Anzeige bereitgestellt (CollectionViewSource.View). Wenn die Daten noch nicht da sind, wird halt Nothing geliefert und nix angezeigt.
     
    5. Die Lade-Methode startet den BackgroundWorker
    6. Der Backgroundworker führt asynchron das Laden der Daten aus und meldet das Ende über das RunWorkerCompleted-Ereignis.
    7. In der RunWorkerCompleted-Ereignisroutine werden die geladenen Daten der CollectionViewSource zugewiesen und ein PropertChanged für die Sicht (“View”) ausgelöst.
    8. Die Oberfläche fragt wieder bei der Sicht (“View”) an und bekommt dieses Mal eine gefüllte Sicht.
     
     
    --
    Viele Gruesse
    Peter
    Dienstag, 16. August 2011 11:44
  • Hallo phensel,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Montag, 22. August 2011 11:40
    Moderator