8 Stimmen

Gibt es eine Diskrepanz zwischen MVVM und der Möglichkeit, den Komponentenbaum der View zu ändern?

Nach dem Lesen aller StackOverflow-Einträge zu Model-View-ViewModel Architektur zusammen mit den meisten leicht zugänglichen Ressourcen im Netz bin ich zu dem Schluss gekommen, dass es der De-facto-Standard für den Bau von SOLID Silverlight-Anwendungen.
Ich habe begonnen, meine nächste Anwendung mit dieser Architektur zu planen. Eine der Anforderungen an die Anwendung besteht darin, die Struktur der visuellen Komponenten aufzubauen oder zu ändern. Als Reaktion auf Benutzerinteraktionen möchte ich zum Beispiel programmatisch eine unbekannte Anzahl von Rechtecken und Ellipsen an eine bestimmte Leinwand oder Leinwände anhängen.
Ich fing an, mir den Kopf zu zerbrechen, um das MVVM-Muster anzuwenden und zu überlegen, wo der Code, der für das Anhängen der neuen Komponenten verantwortlich ist, hingehört. Ich kam zu dem Schluss, dass er nicht zu einer der MVVM-Schichten gehört und es daher unmöglich ist, diese Architektur in einer Szenerie anzuwenden, in der man den Komponentenbaum zur Laufzeit manipulieren muss.
Gibt es eine Möglichkeit, trotzdem die Model-View-ViewModel in dieser Art von Szenarien oder ist es nur auf die Arbeit mit einer festen View-Komponentenstruktur beschränkt?

8voto

Kent Boogaart Punkte 170094

Manipulieren Sie den Komponentenbaum nicht. Manipulieren Sie stattdessen ein Modell, das den Komponentenbaum darstellt. Binden Sie dann Ihre Ansicht an die verschiedenen Sammlungen und Eigenschaften in diesem Modell, um die visuellen Elemente zu erzeugen.

Im Folgenden wird ein stark vereinfachtes Beispiel dargestellt. Es zeigt nur die Konzepte - bitte nehmen Sie es nicht als Indikator dafür, wie Sie Ihren Code gestalten sollten.

Zunächst zu meinem Modell:

public abstract class Shape
{
    public double Left { get; set; }
    public double Top { get; set; }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
}

Als Nächstes lege ich eine Sammlung der besagten Formen frei (Sie würden ein anderes Modell verwenden, um diese Sammlung zu enthalten). Dann binde ich in meiner Ansicht an sie:

<Window x:Name="_root" x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Rectangle}">
            <Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="Black"/>
        </DataTemplate>
    </Window.Resources>
    <ItemsControl DataContext="{Binding ElementName=_root}" ItemsSource="{Binding Shapes}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Canvas.Left" Value="{Binding Left}"/>
                <Setter Property="Canvas.Top" Value="{Binding Top}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</Window>

2voto

David Schmitt Punkte 56455

Das grundlegende Problem in Ihrer Frage ist die Verwechslung von Anforderungen Ihrer Benutzer (Manipulation von Objekten, die durch Rechtecke und Ellipsen dargestellt werden (ich nehme nur an)) mit Implementierungsdetails (Anhängen von Rectangle s und Ellipse s zu Canvas es).

Noch einmal zu den unterschiedlichen Verantwortlichkeiten im MVVM-Muster:

Siehe

Übersetzen Sie das ViewModel in Pixel und übersetzen Sie Eingabeereignisse in Methodenaufrufe auf dem ViewModel.

Dies wären die eigentlichen Silverlight-Komponenten ( Rectangle , Ellipse , Canvas ), die gegen ihre DataContext und mit ein paar sehr kleinen Event-Handlern oder Command s oder was auch immer.

Modell

Halten Sie Daten und Geschäftslogik auf eine domänenspezifische Weise.

Dies stellt die "mathematischen" Rechtecke und Ellipsen dar, die Ihre Benutzer zeichnen.

ViewModel

Verfeinern Sie das Modell auf eine UI-orientierte und oft anwendungsspezifische Weise.

Hier speichern Sie flüchtige Informationen wie "aktuell ausgewähltes Objekt", die für eine bestimmte Ansicht relevant sind, aber keine Attribute des zugrunde liegenden Modellkonzepts sind.

Lesen Sie meinen Blog für mehr über meine Ansichten zu MVVM .

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