MVVM - Sollte die Ansicht hat einen Verweis auf den Moderator / Viewmodel?
Frage
Ich habe mich durch die PRISM 2 Proben für Ideen, wie eine neue Anwendung am besten Ansatz auf ich arbeite, die eine PRISM 2 / WPF-Anwendung sein. Suchen Sie insbesondere bei der Ansicht Injection Beispielanwendung, die Schiffe mit PRISM ich bemerkt habe, dass alle Ansichten eine Schnittstelle implementieren, die den Moderator (oder Ansichtsmodell) mit der Ansicht interagieren können.
In der Vergangenheit habe ich diese das Gegenteil umgekehrt gemacht habe, spritze ich den Moderator in die Ansicht, so dass der Blick direkt auf Methoden auf dem Moderator ein bisschen wie folgt aufrufen können:
public partial class SomeView : ModuleBase
{
private ISomePresenter _somePresenter;
public SomeView (ISomePresenter somePresenter):this()
{
// Give the view a reference to the presenter
_somePresenter = somePresenter;
// Bind the View to the presenter
DataContext = _somePresenter;
}
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
// The view can call actions directly on the presenter (OK I should probably use a command for this)
_somePresenter.SomeAction();
}
}
Die Technik schien oben vernünftig genug für mich, aber Blick auf den Proben beginne ich den Ansatz in Frage zu stellen. Hat jemand Ansichten (kein Wortspiel beabsichtigt) auf dem besten Weg, um dies zu?
- Fügen Sie den Moderator zu der Ansicht, und erhalten Sie die Ansicht mit dem Moderator zu interagieren
- Fügen Sie den Blick auf den Vortragenden und den Moderator erhalten mit der Ansicht zu interagieren
- etwas ganz anderes, dass ich noch nicht gedacht haben?
Lösung
Ich denke, es ist alles eine Frage des Geschmacks. Persönlich genieße ich, wie Sie es in den Proben sehen bei Ihnen suchen. IView ein Verfahren hat, das ist SetViewModel (...). IViewModel hat eine Eigenschaft Blick vom Typ Object genannt, die im Wesentlichen gibt die DI instanziiert IView.
Der Grund, warum ich so mag, ist, ich fast immer zuerst ein Ansichtsmodell erstellen will, und ich will niemand in dem Code der Lage sein, alles zu tun, mit meinem IView, außer Verweis auf die Instanz erhalten ( für view Injektion oder Binden der Ansicht eines Content) zu sagen, weshalb seine Aufgabe vom Typ ist. Wenn jeder Code der View sprechen muss, für mich, es ist immer über die VM ... und selbst dann wird die Ansicht aktualisiert in der Regel über die Bindung. Es würde das Gefühl seltsam aus der View- gehen> ViewModel-> UpdateBinding-> Ansicht, als es ist, VM-> UpdateBinding-> Ansicht
Um die Frage zu beantworten, ich in der Regel brauchen nicht einen Verweis auf den Vortragenden in der Code-Behind. Normalerweise kann ich damit umgehen, dass mit den Befehlen aus der Sicht auf die VM gebunden zu sein. In einigen Fällen könnten Sie Bezug auf den Vortragenden halten zu tun, was Sie in Ihrem Beispiel, aber es ist vermeidbar die richtige Toolset gegeben (macht SL härter, dass es nicht in Befehle gebaut hat).
Wie ich schon sagte, es ist alles eine Frage des Geschmacks ...
-Jer
Andere Tipps
Der häufigste Ansatz ein Ansichtsmodell auf einen Blick in MVVM zur Karte ist eine DataTemplate
zu verwenden:
<DataTemplate DataType="{x:Type vm:SomeViewModel}">
<v:SomeView />
</DataTemplate>
Wenn Sie eine Ansichtsmodell-Instanz in einem Content oder Item anzuzeigen, WPF wird die entsprechende Ansicht für das Ansichtsmodell automatisch instanziiert, und legen Sie die DataContext
-Ansicht auf die Ansichtsmodell-Instanz.
Auf diese Weise Sie haben keinen Bezug auf die Ansicht in der Ansichtsmodell, und die Ansicht verweist nur die Viewmodel durch die DataContext
Eigenschaft. Im Fall, dass Sie wirklich die Ansichtsmodell in der Anzeige für den Zugriff auf Code-behind, können Sie immer die DataContext
werfen (aber dies bedeutet, dass die Ansicht weiß über die tatsächliche Art des Ansichtsmodell, die Kopplung induziert)