none
Zugriff von ViewModel auf einen "Container" mit View RRS feed

  • Frage

  • Hallo,

    ich habe eine Verständnisfrage zu MVVM. Ich habe ein CustomUserControl, dieser dient als eine Art Container.

    Dieser Container hat einen ContentPresenter dem ich die verschiedenen Inhalte, also die Views, zuweisen kann.

    Nun möchte ich diesen Container ZB manchmal minimieren oder den Status des Containers ändern. Dies wird über den View ausgeköst und müsste doch dann im ViewModel ausgeführt werden. Nur wie bekomme ich vom ViewModel Zugriff auf den Container? Die kennen sich doch eigentlich gar nicht.

    Danke für eure Hilfe !

    Donnerstag, 6. Juni 2013 15:02

Antworten

  • Hallo Dru_MS... ???

    was hast du denn jetzt ein UserControl oder ein CustomControl?

    Ich unterscheide immer zwischen den Verantwortlichkeiten (SeparationOfConcerns)... UI-Spezifische Funktionalitäten, die in der Regel für das Verhalten(Behavior) und dem Aussehen(Layout/Styles etc.) des UI zuständig sind und der UI-Logic die eher Datenzentrisch ist, also Statusänderungen die sich auf Grund geänderter Daten ergeben oder Benutzerinteraktionen (Commands, Input etc.) die sich auf Daten und deren Status auswirken. Das eine ist im View (UI) das andere im ViewModel (UI-Logic), dabei muss man schon genau hinschauen und auch klar abstrahieren, da die Grenzen fließend sein können und dies Anfangs sicherlich auch Probleme bereiten kann, im Laufe der Zeit gibt sich das aber. Entgegen weit verbreiterter Meinung ist es nicht verboten, reine UI-Funktionalitäten, also Funktionalität die ausschließlich mit dem UI zu tun hat, im Code-Behind zu implementieren.

    das kann wie folgt aussehen:

    MVVM Pattern Diagramm

    Um bei deinem Beispiel zu bleiben würde ich eine Funktion "Minimize" oder "Maximize", die als Interaction durch den Benutzer ausgelöst werden kann, ausschließlich dem Verhalten(Behavior) des UI zuordnen. Dies könntest du direkt im Code-Behind implementieren oder, was etwas mehr Flexibilität bringen würde, ein attached Behavior implementieren das diese Funktionalität an dein UIElement bindet.

    Wenn jetzt aber Statusänderungen auf Grund geänderter Daten stattfinden, dann sollte das im ViewModel implementiert werden. Dazu hast du dann mehrere Möglichkeiten, entweder als Property, als Command oder als Event die du dann an dein UIElement bindest. Die Reihenfolge Property, Command, Event spiegelt auch die Häufigkeit wieder, wie das durch Entwickler implementiert wird, wobei das Property-Binding sicherlich auch die einfachste Lösung ist.

    Hier kannst du einiges nach lesen:

    WPF Databinding

    oder hier (ist zwar schon zieml. alt... aber es gilt heute noch)

    WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster

    Und wenn du jetzt immer noch nicht weiter kommst, dann melde dich noch mal ;-).

    Gruß Carl


    Carl-Christian Schaffert Bahnhofsweg 2 82008 Unterhaching mobile: 0152-33 72 79 49 email: carl-christian.schaffert@dotnet-dev-expert.de skype: carl.christian.schaffert


    Freitag, 7. Juni 2013 12:56

Alle Antworten

  • Hi,
    Zustände verwaltet der ViewModel. Die Views – ein CustomControl ist auch nur ein View – holen sich die Zustände über Bindung aus den ViewModels. Schau Dir mal Prism an. Vereinfacht dargestellt ist das da gelöst, indem zum Programmstart alle Views usw. registriert werden und sie bei Bedarf vom ViewModel aktiviert werden und damit in einem Container erscheinen.
     
    --
    Peter Fleischer
    Donnerstag, 6. Juni 2013 19:35
  • Hallo Dru_MS... ???

    was hast du denn jetzt ein UserControl oder ein CustomControl?

    Ich unterscheide immer zwischen den Verantwortlichkeiten (SeparationOfConcerns)... UI-Spezifische Funktionalitäten, die in der Regel für das Verhalten(Behavior) und dem Aussehen(Layout/Styles etc.) des UI zuständig sind und der UI-Logic die eher Datenzentrisch ist, also Statusänderungen die sich auf Grund geänderter Daten ergeben oder Benutzerinteraktionen (Commands, Input etc.) die sich auf Daten und deren Status auswirken. Das eine ist im View (UI) das andere im ViewModel (UI-Logic), dabei muss man schon genau hinschauen und auch klar abstrahieren, da die Grenzen fließend sein können und dies Anfangs sicherlich auch Probleme bereiten kann, im Laufe der Zeit gibt sich das aber. Entgegen weit verbreiterter Meinung ist es nicht verboten, reine UI-Funktionalitäten, also Funktionalität die ausschließlich mit dem UI zu tun hat, im Code-Behind zu implementieren.

    das kann wie folgt aussehen:

    MVVM Pattern Diagramm

    Um bei deinem Beispiel zu bleiben würde ich eine Funktion "Minimize" oder "Maximize", die als Interaction durch den Benutzer ausgelöst werden kann, ausschließlich dem Verhalten(Behavior) des UI zuordnen. Dies könntest du direkt im Code-Behind implementieren oder, was etwas mehr Flexibilität bringen würde, ein attached Behavior implementieren das diese Funktionalität an dein UIElement bindet.

    Wenn jetzt aber Statusänderungen auf Grund geänderter Daten stattfinden, dann sollte das im ViewModel implementiert werden. Dazu hast du dann mehrere Möglichkeiten, entweder als Property, als Command oder als Event die du dann an dein UIElement bindest. Die Reihenfolge Property, Command, Event spiegelt auch die Häufigkeit wieder, wie das durch Entwickler implementiert wird, wobei das Property-Binding sicherlich auch die einfachste Lösung ist.

    Hier kannst du einiges nach lesen:

    WPF Databinding

    oder hier (ist zwar schon zieml. alt... aber es gilt heute noch)

    WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster

    Und wenn du jetzt immer noch nicht weiter kommst, dann melde dich noch mal ;-).

    Gruß Carl


    Carl-Christian Schaffert Bahnhofsweg 2 82008 Unterhaching mobile: 0152-33 72 79 49 email: carl-christian.schaffert@dotnet-dev-expert.de skype: carl.christian.schaffert


    Freitag, 7. Juni 2013 12:56
  • Hallo Peter, hallo Carl-Christian,

    danke für eure Antworten.

    Also ich versuche momentan einen MVVM-Wizard zu erstellen, daher auch die Minimize-Funktionalität und die Änderung der Status.

    Der Status muss je nach Eingabe angepasst werden können, bzw auf die Eingabe im View reagieren. Ich werde mir mal die Behaviors ansehen, damit habe ich noch nie etwas gemacht. Bislang habe ich nur einfache Entwicklung mit WPF gemacht, ich denke da habe ich noch nen weiten Weg vor mir. Aber MMVM ist schon sehr spannend, gerade im Hinblick auf UnitTest etc. DANKE nochmal !!!

    VG

    Dienstag, 11. Juni 2013 09:59
  • Hallo DruMS

    mich würde interessieren was du mit "Minimize" in einem Wizard machst?

    MVVM solltest du nicht überbewerten, wenn du Software erstellst bei der auf "automatisierte" Tests verzichtet wird und du das UI/UX-Design nicht von der Entwicklung trennst, dann kannst du weiter machen wie bisher... MVVM ist keine Pflicht ;-). Wenn du dennoch Software nach dem MVVM-Pattern erstellen willst, dann hilft dir mein erstes Posting weiter... es ist alles halb so schwer... als du annimmst, manchmal sieht man den Wald vor Bäumen nicht ;-).

    Mich würde auch noch interessieren was du mit "der Status muss je nach Eingabe angepasst werden" meinst... hast du da ein Beispiel?

    Viele Grüße Carl


    Carl-Christian Schaffert Bahnhofsweg 2 82008 Unterhaching mobile: 0152-33 72 79 49 email: carl-christian.schaffert@dotnet-dev-expert.de skype: carl.christian.schaffert

    Dienstag, 11. Juni 2013 18:27
  • Hallo Dru_MS,

    Wenn Dir die Antworten geholfen hat, dann bitte markiere diese als Antwort.

    Danke und Gruss,

    Ionut

    Donnerstag, 13. Juni 2013 14:29
    Moderator
  • Hi,

    kurz zu dem Hintergrund wofür ich den Wizard benutzen möchte.

    Der Wizard soll als Eingabeformular dienen. Dieses Eingabeformular benutze ich zur Editierung von Geodaten. Diese liegen auf einer Map.

    Wähle ich nun einen Punkt auf der Map aus soll sich der Wizard öffnen. Aus dem Wizard heraus möchte ich aber auch mit der Map interagieren, dazu brauche ich dann ein "Minimize" , denn sonst ist die Anzeige der Map verborgen.

    Den Status benötige ich um zB auf Validierungen innerhalb des Wizards reagieren zu können. Buttons sollen zB disabled oder ganz ausgeblendet werden können.

    Ich hoffe die kurze Erklärung reicht, sonst hole ich noch weiter aus ;-)

    SG und Danke für die Hilfe/Tipps.

    Sonntag, 16. Juni 2013 10:00
  • Ah ja... ich kapiere...

    dann ist das eher ein Eingabe-Dialog... ist es da nicht besser einen halbtransparenten Child-Dialog direkt über die Map zu legen und das direkt mit den Geodaten zu verknüpfen, so dass der Dialog auch immer in der Nähe der in Frage kommenden Geodaten erscheint... und halbtransparent... damit der Benutzer immer einen visuellen Kontakt zu dem Punkt hat, an dem er zusätzliche Infos oder was auch immer, anbringen will... damit bräuchte er immer nur hin & her zu klicken... und du könntest es sogar so gestalten, dass der Benutzer das einstellen kann ob der Dialog während dem hin & her klicken stehen bleibt oder verschwindet... na ja, war nur eine unausgegorene Idee... aber der Anwender hätte weniger zu klicken.... und es käme dem Interaktions-Gedanken näher. Eine rechte elegante Lösung wäre, dazu einen Adorner zu benutzen...

    Gruß... Carl


    Carl-Christian Schaffert Bahnhofsweg 2 82008 Unterhaching mobile: 0152-33 72 79 49 email: carl-christian.schaffert@dotnet-dev-expert.de skype: carl.christian.schaffert

    Sonntag, 16. Juni 2013 11:21