none
WPF, MVVM, Der aufrufende Thread kann nicht auf dieses Objekt zugreifen ..... RRS feed

  • Allgemeine Diskussion

  • Im ViewModel möchte ich gerne auf ein Control der View zugreifen.

    Ich dachte es wäre eine gute Idee mir das Hauptfenster zu schnappen:

    >System.Windows.Window wi = System.Windows.Application.Current.MainWindow;
    >object cal = wi.FindName("datepickerControlName");

    Erhalte aber schon beim 'Fangen' des Hauptfensters

    System.Windows.Application.Current.MainWindow = "System.Windows.Application.Current.MainWindow" hat eine Ausnahme vom Typ "System.InvalidOperationException" verursacht.

    Message = "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."

    Ich habe ehrlich gesagt keine Idee, wie ich das löse.
    Passiert auf: VS 2012 (kein RC!) auf Win7 32Bit Framework 4.0

    Mittwoch, 22. August 2012 08:52

Alle Antworten

  • Hi Guenter,

    beim MVVM Pattern ist die grundlegende Idee, dass das ViewModel die View gar nicht kennt.

    Änderungen an der View sollten über Bindings oder Events des ViewModel gemacht werden.

    Ich denk zusätzlich du noch einen 2. Thread gestartet mit dem du auf das Control zugreifen willst.

    Was so nicht Funktioniert, grundlegend sollten aber auch alle Zugriffe auf das Control im gleichen Thread Passieren.

    MFG

    Björn 

    Mittwoch, 22. August 2012 09:19
  • Hi Günter,
    wenn es wirklich erforderlich ist, vom ViewModel auf Innereien der View zuzugreifen, kann eine “Attached Behavior” genutzt werden, Die Idee darin ist, dass eine DependenyProperty des ViewModels bereitgestellt wird, die dann im View gebunden wird. Der Bindevorgang wird dann “abgefangen” und als “sender” hat man dann im ViewModel das gebundene Steuerelement der View.
     
    Unabhängig davon muss dann aber bei multithreading der thread-übergreifende Zugriff mittels Invoke bzw. Dispatcher an den UI-Thread übergeben werden.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 22. August 2012 09:51
  • Hallo, der Fehler "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet." kommt normalerweise daher, das du versuchst auf ein Contro, oder ähnliches zuzugreifen, welches aber von einem anderen thread erstellt wurden ist. Was ja soweit logisch ist. Wenn ich 2 Threads (MainWindows und Backgroundworker) habe, somit müsste ich vom Backgroundworker aus über einen Dispatcher auf das MainWindow zugreifen, damit der Fehler nicht kommt. Warum benutzt du System.Windows.Application.Current.MainWindow um an das MainWindow heran zu kommen? Erstelle doch eine Instanz des MainWindows, über welches du dann von Application aus zugreifen kannst!?

    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 22. August 2012 13:24
    Moderator
  • Warum benutzt du System.Windows.Application.Current.MainWindow um an das MainWindow heran zu kommen? Erstelle doch eine Instanz des MainWindows, über welches du dann von Application aus zugreifen kannst!?
     
    Dieser Weg kann ohne zusätzliche Beschreibung, wie das konkret realisiert wird, fehlschlagen. Wenn eine neue Instanz erstellt wird, dann greift man nicht auf das eigentliche Hauptfenster zu.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 22. August 2012 13:31
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 31. August 2012 19:49
    Moderator