2009-03-16 10 views
1

Ich bin neu in Prism und ich versuche, eine bewährte Methode zum Deaktivieren einer Ansicht in einer Prism 2-Anwendung zu bestimmen - wenn ein Benutzer auf eine Schaltfläche auf der Ansicht klickt um die Ansicht zu deaktivieren. Die Ansicht führt einen Befehl aus, wenn auf die Schaltfläche geklickt wird.Prism 2 SL: Entfernen der Ansicht aus der Region, wenn die Schaltfläche geklickt wurde

Das Ansichtsmodell empfängt den Befehl, aber das Ansichtsmodell hat keinen Verweis auf den Regionsmanager.

Sollte das Ansichtsmodell über den Regionsmanager wissen? Und selbst wenn das Ansichtsmodell einen Verweis darauf hatte, muss die Ansichtsinstanz zur deaktivierten Methode für die enthaltende Region übergeben werden.

Ich verwende das MVVM-Muster für die App.

Antwort

4

Ich gehe hier ein Stück weit und gehe davon aus, dass Sie ein Itemscontrol oder ähnliches für Ihre Region verwenden, weil das die offensichtlichste Verwendung eines "Knopfes ist, der eine Ansicht entfernt".

In diesem Fall sollten Sie einen Controller (oder wie auch immer Sie es nennen möchten, aber das Prism-Team scheint diesen Namen für diese Art von Verantwortung zu verwenden) irgendwo verantwortlich für die Verwaltung der aktiven ViewModels und entweder Sie zeigen Ihre Ansichten mit DataTemplates an oder Sie erstellen/hinzufügen/aktivieren manuell eine neue Ansicht, wenn Sie eine neue Instanz hinzufügen. Ihr Fall scheint der zweite zu sein, und der Controller sollte für die Verwaltung der Ansichten zuständig sein. Ihr Ansichtsmodell sollte über Dependency Injection einen Verweis auf diesen Controller erhalten und es aus dem Pool der aktiven Modelle/Ansichten entfernen.

Der Controller selbst empfängt den IRegionManager und findet die Region, für die er zuständig ist.

Ich hoffe, dass das Sinn macht, bitte kommentieren, wenn es nicht tut.

+0

Es ist ein Willkommensbildschirm, dass, wenn der Benutzer auf die Schaltfläche klickt - ich will, dass es verschwinden, wodurch die Hauptansicht der App angezeigt wird. Die Region, die ich verwende, ist nur eine Inhaltskontrolle. Ist es sinnvoll, das IModul zu verwenden, zu dem die Ansicht gehört, als den Controller - weil das die Sichten registriert? – MIantosca

+0

In diesem Fall würde ich ja sagen. Ihr Ansichtsmodell könnte den EventAggregator (existiert in Prism SL?) Verwenden, um jedem Objekt zu signalisieren, dass es verantwortlich ist, die Ansicht zu verwerfen.Auf diese Weise bleibt Ihr View/ViewModel von der eigentlichen Aufgabe, Regionen zu verwalten, isoliert. –

+0

cool - Ich hatte darüber nachgedacht, ein Ereignis zu verwenden, um das Viewmodel vom Regionmanager zu entkoppeln - vielleicht ein Allzweck-Event, das von jeder View gefeuert werden kann, wenn es deaktiviert werden muss. Wie kann das Ansichtsmodell einen Verweis auf die Ansicht erhalten, damit sie weitergegeben werden kann? – MIantosca

0

Ich habe auch hier aufgehängt. Da der RegionManager für die enthaltenen Regionen verantwortlich war, kam es zu einer engen Kopplung zwischen meinem RegionManager und den Regionen, die ich verwalten wollte.

Es war eine komplexe Aufgabe, diese Regionen extern zu managen (aus einem Hauptanwendungsmenü) und infolgedessen haben wir das PRISM-Framework fallen gelassen und unseren eigenen Code basierend auf den Composite Application Guidance-Elementen geschrieben Szenario.

+0

Haben Sie Prism oder nur die Region-Dateien gelöscht? –

+0

Wir haben die PRISM-Framework-Komponenten fallengelassen und nur die Anleitung (Dokumentation) verwendet, um ein Eventing-Subsystem zu erstellen (funktioniert genauso wie der Ereignisaggregator). Wir planen, das PRISM-Framework wieder hinzuzufügen, sobald es ein wenig reifer geworden ist, und weitere Unterstützung ist verfügbar. –

2

EventAggregator in Ihrem Fall (Kontrolle, die sich entladen muss) ist vielleicht zuviel des Guten, weil einfache Injektion von IRegionManager zu diesem Steuerungssicht Modellbauer

ctor (IRegionManager regionManager) 
{ 
    this.RegionManager = regionManager 
} 

und dann so etwas wie dieses

this.regionManager.Regions[regionName].Remove(this.View); 

sollte das tun, was du verlangst.

IRegionManager ist eine ansprechende Schnittstelle, die einfaches Testen ermöglicht und nur eine Abstraktion ist, die Sie nicht an die Implementierung koppelt und IoC ermöglicht.

+0

Ich wollte nicht, dass meine Ansichten etwas über Regionsmanager oder Regionsmanager wissen ( – MIantosca

+0

). Sie fügen diesen Code nicht im View hinzu, sondern fügen ihn dem View-Modell (Präsentationsmodell) hinzu, dessen IMHO OK ist, um einen IRegionManager zu erhalten . Aber wenn Sie den "reinen" Ansatz beibehalten möchten, könnte Jeremys Screen Activator der richtige Weg sein http://codebetter.com/blogs/jeremy.miller/archive/2009/09/07/screen-activator-pattern .aspx –

+0

Gibt es etwas Besonderes an einer nachahmenswerten Schnittstelle? Sie drängen eine Menge Schlagworte dort für sehr wenig Gewinn. – Gusdor