Laden...

WPF: Verständnisfrage zu MVVM / Hilfe bei Demoapplikation

Erstellt von vita85 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.386 Views
V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren
WPF: Verständnisfrage zu MVVM / Hilfe bei Demoapplikation

Hallo zusammen,
ich bin gerade dabei mich in das Thema Model-View-ViewModel einzuarbeiten und wollte in dem Zusammenhang dann auch meine erste Demo-Applikation erstellen, an der ich mich in zukünftigen Projekten orientieren kann.

Das grundsätzliche Prinzip von MVVM habe ich soweit verstanden. Womit ich mich noch ein wenig schwer tue, ist die richtige Zuordnung der Klasse, die meine Daten einliest.

Konkret heißt dies folgendes:
Meine Demoapplikation soll ein Programm werden, in welches man ein Datum, einen Verwendungszweck und einen Euro-Betrag eingibt. Diese eingegebenen Daten fließen dann in eine CSV-Datei hinein.
Zusätzlich soll eine Tabelle (ListView) anzeigen, was bereits in der CSV-Datei drin steckt (also Daten, Verwendungszwecke und entsprechende Beträge).

Folgendermaßen sieht mein XAML-Code aus:


<Window x:Class="MVVM1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Money Machine" Height="260" Width="320" Icon="/MVVM1;component/money.ico" 
        WindowStartupLocation="CenterOwner">
    <Grid>
        <ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,76">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Datum" Width="70" />
                    <GridViewColumn Header="Verwendungszweck" Width="140" />
                    <GridViewColumn Header="Betrag" Width="60" />
                </GridView>
            </ListView.View>
        </ListView>
        <DatePicker Height="25" HorizontalAlignment="Stretch" Margin="0,0,0,50" VerticalAlignment="Bottom" BorderBrush="#FF828790" DisplayDate="{Binding DateToday}" />
        <Label Content="Verwendungszweck: " Height="23" HorizontalAlignment="Left" VerticalContentAlignment="Center" VerticalAlignment="Bottom" Padding="0" Margin="0,0,0,25"/>
        <TextBox Height="23" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" BorderBrush="#FF828790" Margin="110,0,0,25" />
        <Label Content="Betrag: " Height="23" HorizontalAlignment="Left" VerticalContentAlignment="Center" VerticalAlignment="Bottom" Padding="0" Margin="0,0,0,0"/>
        <Button Content="Eintragen" Height="23" HorizontalAlignment="Right" VerticalAlignment="Bottom" />
        <TextBox Height="23" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" BorderBrush="#FF828790" Margin="42,0,53,0" />
    </Grid>
</Window>

Das dazugehörige Model sieht bis jetzt so aus:


using System;

namespace MVVM1.Model {
    public class Ausgabe {

        // Attribute definieren
        public DateTime Datum { get; set; }
        public string Verwendungszweck { get; set; }
        public double Betrag { get; set; }

        // Konstruktor zur Erstellung eines Objekts vom Typ Ausgabe
        public Ausgabe(DateTime datum, string verwendungszweck, double betrag) {
            Datum = datum;
            Verwendungszweck = verwendungszweck;
            Betrag = betrag;
        }
    }
}

Geplant war nun folgendes: Ich mache eine Liste von Objekten des Typs "Ausgabe" und binde diese Liste an die Tabelle (ListView), jedoch bin ich mir nicht ganz sicher an welcher Stelle bzw. in welcher Klasse ich dies machen sollte.
Also quasi: Kommt der CSV-Parser, welcher dann nachher die Liste mit Ausgabe-Objekten zurückgibt auch ins Model, oder pack ich das in eine andere Klasse?

Oder gehe ich das alles komplett falsch an?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo vita85,

kennst du THE MODEL-VIEW-VIEWMODEL (MVVM) DESIGN PATTERN FOR WPF? Da ist ein ähnliches Beispiel. Wenn du das nicht kennst schau dir das an, vllt. erübrigt sich dann deine Frage bzw. dein Verständnisproblem löst sich.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Das kannte ich noch nicht. Beim überfliegen ist mir aufgefallen, dass der Code noch etwas zu hoch für mich ist. Zu viele Elemente, die ich noch nicht kenne, aber ich versuche mal damit klar zu kommen.

Was mein Problem angeht: So wie ich es nun herausgelesen habe, wäre der richtige Weg die Erstellung einer Repository-Klasse, die über Get bzw. Set meine Daten aus der CSV in eine Liste pumpt und weiterreicht.

Ich habe nun vier Namespaces erstellt: Model, DataAccess, View, ViewModel.
Die Repository-Klasse kommt ins DataAccess. In der Repository-Klasse werden dann aus der CSV-Datei Objekte der Klasse Ausgabe (welche sich im Namespace Model befindet) erzeugt und in einer Liste zusammengefasst.
Die Änderung wird ans ViewModel weitergegeben und schlussendlich mittels Datenbindung in der View angezeigt.

Sind die Überlegungen im letzten Abschnitt so richtig?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo vita85,

fast richtig.

Die Änderung wird ans ViewModel weitergegeben

Auch das ViewModel gibt Änderungen an das Model weiter. Das VM ist sozusagen ein Wrapper um das Model damit es besser zu View (der UI) passt. Das Repository (od. besser noch eine Unit of Work) merkt sich dann die Änderungen am Model und wenn gespeichert wird, werden die Änderungen in die Datenquelle - bei dir die CSV - geschrieben.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Perfekt, danke dir schonmal soweit 😁