9 Stimmen

Warum sollte ich MVVM in einer Silverlight-Anwendung verwenden?

Ich möchte wissen, warum wir MVVM verwenden sollten, um eine Silverlight-App zu implementieren. Was sind die Vorteile?

Wir machen keinen Unit Test für ViewModel, also möchte ich andere Gründe.

Im Folgenden stelle ich Fragen zu einigen Vorteilen, die die Leute gewöhnlich nennen:

1. lose gekoppelt: Wenn wir MVVM verwenden, eine Ansicht auf ViewModel, aber nicht eine Ansicht, warum es lose gekoppelt ist?

Wenn ich öffentliche Methoden in einem Code-Behind bereitstelle, können sie auch wiederverwendet werden.

4voto

Rick Sladkey Punkte 33363

Nun, die Unit-Testbarkeit des View-Modells ist ein bedeutender Vorteil, so dass Sie diesen Vorteil nicht nutzen können. Was die anderen beiden angeht:

Lose gekoppelt

Ja, die Ansicht stützt sich auf das Ansichtsmodell. Sie müssen in irgendeiner Weise miteinander verbunden sein, um die Funktion der Anwendung zu erfüllen. Folglich können sie nicht entkoppelt werden. Die einzigen Möglichkeiten sind tightly-coupled oder loosely-coupled oder irgendwo dazwischen. Mit MVVM interagiert Ihr View-Modell mit Ihrem View in einer sehr begrenzten Weise: im Grunde nur Objekte, Eigenschaften und Befehle. Vergleichen Sie das damit, dass Sie alles im Code-Behind machen, wo die Ansicht und ihre Steuerung im Wesentlichen untrennbar sind.

Wiederverwendung

Wenn ein Code in Ihrem Code-Behind so wiederverwendbar ist, dass er öffentlich sein sollte, kann er aus dem Code-Behind herausgenommen und in eine allgemeine Klasse eingefügt werden. Das Problem ist, dass das, was danach übrig ist, nicht wiederverwendbar ist.

Wenn Sie nicht tief in MVVM eintauchen wollen, können Sie einige der Vorteile von MVVM nutzen, indem Sie sich auf die Datenbindung konzentrieren. Nachdem Sie die Vorteile der Datenbindung kennengelernt haben, können Sie die anderen Vorteile von MVVM neu überdenken.

4voto

P.K Punkte 17959

Wir machen keinen Unit Test für ViewModel,

Bei MVVM geht es nicht nur um Unit-Tests für das ViewModel. Idealerweise sollte Ihre VM sehr schlank sein und nur Eigenschaften haben, die von der Ansicht benötigt werden. Es ist also nicht wirklich notwendig, die VM zu testen.

Aber wie führen Sie ohne eine VM Ihre Funktions-/Funktionstests über mehrere Schichten hinweg durch? Um das Testen zu erleichtern, sollten Sie in Silverlight Befehle verwenden, anstatt Code in Code-Behind-Dateien zu schreiben. So können Sie während des Unit-Tests Schaltflächenklicks und andere GUI-Ereignisse simulieren. Wenn Sie MVVM-Muster zusammen mit Befehlen verwenden, können Sie den gesamten C#-Code (nicht xaml) bis hin zur Benutzeroberfläche (Konverter, VMs usw.) testen.

Wenn ich öffentliche Methoden in einer Code-Behind bereitstelle, können sie auch Wiederverwendbarkeit.

Ohne ins Detail gehen zu wollen, warum das ein schlechtes Design ist, möchte ich Sie fragen, wie das die Wiederverwendbarkeit gewährleistet. Wenn Sie ein Benutzerelement erstellen, dann ist die Code-Behind-Klasse ein Steuerelement? Sie wollen Instanzen Ihres Steuerelements erstellen und diese verwenden? Das ist so, als würden Sie sagen, warum brauchen wir Member-Methoden, wir können einfach öffentliche statische Methoden erstellen und auf sie zugreifen. Ich bin der festen Überzeugung, dass es besser ist, diese Technologien NICHT zu verwenden, wenn wir die von WPF/Silverlight bereitgestellte automatische Bindung nicht nutzen wollen. Und um die Möglichkeiten der Bindung voll auszuschöpfen, ist MVVM unerlässlich.

warum es lose gekoppelt ist?

VM ist sehr wohl Teil Ihrer Sichtweise. Sie ist nicht von der Ansicht entkoppelt. Wie ich bereits gesagt habe, sollte Ihre VM so schlank wie möglich sein und nur öffentliche Eigenschaften enthalten, die von Ihrem View benötigt werden. Ihre Geschäftslogik wird von Ihrer Sicht (und VM) entkoppelt sein.

1voto

Rahul Soni Punkte 4813

Ich denke, dies ist eine der besten verfügbaren Ressourcen, falls Sie die Verwendung von MVVM im Vergleich zu irgendeinem anderen Muster oder keinem Muster verwenden und kontrastieren möchten.

http://karlshifflett.wordpress.com/2010/11/07/in-the-box-ndash-mvvm-training/

1voto

vortexwolf Punkte 13867

Ich kann beantworten, wie ich MVVM-Muster verwenden. MVVM ist besser in den folgenden Szenarien:

1 Wenn mehrere Steuerelemente mit einer einzigen Eigenschaft verbunden sind.

MVVM:

<TextBlock x:Name="text1" Visibility="{Binding IsSomePropertyTrue, Converter={StaticResource VisibilityConverter}"/>
<TextBlock x:Name="text2" Visibility="{Binding IsSomePropertyTrue, Converter={StaticResource VisibilityConverter}"/>

Ich kann schnell ein ähnliches Steuerelement hinzufügen oder ein vorhandenes Steuerelement entfernen.

Vergleiche mit Code-Behind:

public string IsSomePropertyTrue
{
    set
    {
        //...
        text1.Visibility = value;
        text2.Visibility = value; 
    }
}

2 Anstelle eines Multikonverters

public Brush StateColor { get { if (this.State == State.Edited && this.IsPriority) return new SolidColorBrush(Color.FromArgb(255, 0, 255, 0)); //... } }  

<sdk:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Background="{Binding StateColor}" Text="{Binding State}"/>
    </DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>

3 Als Elementmodell in Steuerelementen wie ListBox oder DataGrid. Wenn ich zum Beispiel eine Liste von Elementen mit einer Schaltfläche zum Entfernen neben jedem Element erstellen möchte, erstelle ich ein ItemView-Steuerelement und eine ItemViewModel-Klasse.

<ItemsControl ItemsSource="{Binding SomeItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <view:ItemView DataContext="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

4 Kopieren von Daten aus einer Ansicht in eine andere:

public JournalEntryViewModel(SalesOrderViewModel vm) {}

5 ViewModel kann CLR-Klassen erben und Schnittstellen implementieren (INotifyPropertyChanged oder INotifyDataErrorInfo).

  Außerdem verwende ich MVVM, um Ereignisse durch Befehle oder Eigenschaften zu ersetzen. Und die Verwendung von ViewModels zwingt zum Aufruf von Eigenschaften durch verständliche Namen.

1voto

Michael Brown Punkte 8793

Ich war ein Early Adopter für WPF und ich kann Ihnen sagen, warum ich mich für MVVM entschieden habe (und das gilt mehr oder weniger auch für Silverlight). Für das Projekt, an dem ich arbeitete, musste ich einen Bildschirm erstellen, der es den Benutzern ermöglichte, Benachrichtigungen innerhalb des Systems zu abonnieren. Dies war ein 3-Schritt-Prozess:

  1. Der Nutzer musste nach dem Artikel suchen, über den er benachrichtigt werden wollte
  2. Sie mussten den Artikel auswählen und zusätzliche Optionen für das Abonnement ausfüllen
  3. Das System musste eine Zusammenfassung liefern und dem Benutzer die Möglichkeit geben, das Abonnement zu bestätigen oder zu bearbeiten.

Nachdem ich die Funktionalität das erste Mal implementiert hatte (ohne MVVM), wurde mir gesagt, dass wir Elemente von der Suche ausschließen müssen, die bereits vom Benutzer abonniert wurden.

Nachdem ich diese Korrektur vorgenommen hatte, wurde ich darüber informiert, dass wir dem Benutzer eine Live-Vorschau des Abonnements auf der Grundlage von Optionen geben müssen.

Zu diesem Zeitpunkt bemerkte ich, dass einige dieser Änderungen extrahiert und vereinfacht werden könnten, wenn ich mich nicht mit der Manipulation der Benutzeroberfläche befassen müsste, während ich die Logik änderte. Ich hatte MVVM nie absichtlich verfolgt, aber ich erkannte, dass die Abstraktion, die ich vorgenommen hatte, dem MVVM-Muster sehr ähnlich war.

Aus diesem Grund empfehle ich das Muster. Es vereinfacht die Aufgabe, die Logik zu ändern, die die Benutzeroberfläche steuert, indem es sie von der Benutzeroberfläche selbst trennt. Ich würde auch empfehlen, dass Sie mit der Implementierung warten, bis Sie es brauchen. Die Verwendung von MVVM ist mit Kosten verbunden, die sich jedoch über die Kosten der Änderung der UI-Logik amortisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X