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?
War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top