WPF/XAML - binding von Steuerbefehlen an übergeordnete Fenster viewmodel?
Ich habe eine Anwendung, und ich habe eine Baugruppe.
In der Anwendung, ich habe ein Fenster, und in der Versammlung habe ich ein user control.
Es ist eine Instanz des Benutzersteuerelements in das Fenster.
Sowohl der Benutzer die Kontrolle und die Fenster sind gesichert durch separate viewmodels.
In der Benutzer-Steuerelement ist eine Schaltfläche. Sollte der button aktiviert/deaktiviert werden basierend auf dem Zustand des Benutzersteuerelements viewmodel. Wenn auf die Schaltfläche geklickt wird, wird die Verarbeitung durchgeführt werden muss, basierend auf den Informationen in der Benutzer-Steuerelement viewmodel, aber es getan werden muss, um durch das Fenster viewmodel. (Es sind Aspekte von dem, was getan werden muss und werden soll, außerhalb des Bereichs der Benutzer-Kontrolle.)
Und hier ist die Wendung - das user control nicht verwendet werden, die ausschließlich in diesem Fenster, es könnte verwendet werden, in einem anderen oder in einem Steuerelement, das verwendet wird, in einem Dritten. Der Benutzer control kann nicht erlaubt werden, zu wissen, welche Art von Fenster oder Steuerelement enthält, oder ist der Umgang mit dem Prozess, wenn die Schaltfläche geklickt wird.
Also, was ist zu tun?
Definieren Sie einen Befehl in der Montage, und binden Sie die Benutzer-Steuerelement-Schaltfläche, um Sie, vorbei an der Benutzer-Steuerelement viewmodel als der Befehl parameter? Wie kann ich bind Befehl, um das Fenster viewmodel?
Oder sollte ich definieren, wird der Befehl in die user control viewmodel, dann heben ein Ereignis zu erzählen, das übergeordnete Fenster, das die entsprechenden Maßnahmen ergriffen werden?
Es ist mir nicht klar, was sauberer ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wissen, dass die Eltern Eigenschaft ist ausgesetzt das gleiche mit dem gleichen Namen, Sie können etwas tun, wie diese, die für mich gearbeitet hat viele Male:
Bekommt dieser die usercontrol, geht dann zu den Eltern und bekommt das datacontext-und bindet es an das Kommando. Dies funktioniert, wenn der Benutzer die Kontrolle wird umfasste die durch viele Fenster /Steuerelemente, die setzen den gleichen Befehl (Sie können eine Schnittstelle implementieren, hier).
Könnten Sie dann übergeben Sie die Benutzer-Steuerelement viewmodel dem Befehl (wieder, implementieren einer Schnittstelle) etwa so:
Könnte man eine Messenger-Struktur für die Kommunikation zwischen ViewModels.
MVVMLight enthält eine , die Sie verwenden, oder Sie können schreiben Sie Ihre eigenen.
Bevor Sie dies tun stellen Sie sicher, Sie haben trennen Sie die Aufgaben richtig oder Sie werden am Ende mit spaghetti-Nachrichten-code.
Sollte es werden, Hierarchie-mit dem Blick auf Modelle, wie Sie mit Ihren Kontrollen. Das Hauptfenster hat ein Kind, Benutzer-Kontrolle. Die Haupt-View-Modell sollte in der Lage sein, sich zu verbinden mit User Control View Model (und weisen Sie, wenn nötig). Hier ist, wie ich es tun würde:
XAML:
Dies ist natürlich psuedocode
Klingt wie ein Fall für das Strategie-Muster. http://en.wikipedia.org/wiki/Strategy_pattern
Definieren eine Schnittstelle für ein Strategie-Objekt zugewiesen werden kann das UserControl-viewmodel (oder man verwendet ihn initialisieren). Die Schnittstelle definiert, was Eigenschaften/Methoden/Ereignisse sind notwendig, damit die Strategie-Objekt zum abrufen von der UserControl-viewmodel die Daten für die Verarbeitung, plus ein Mittel gibt das Ergebnis der Verarbeitung zurück an die UserControl-viewmodel.
Erstellen Sie dann eine konkrete Umsetzung der Strategie-Objekt, das collaberates mit dem Fenster viewmodel zu führen, was Aufgabe, die es braucht. In diesem Fall wird das Fenster viewmodel könnte auch die Umsetzung der Strategie-Oberfläche selbst.
Anderen Instanzen des UserControl in anderen Szenarien können dann initialisiert werden, die mit anderen konkreten Implementierungen der Strategie-Objekt, führen Sie die gleiche Aufgabe erforderlich, aber möglicherweise in sehr unterschiedlicher Weise.