Tip C# using MVVM Pattern with example (German)

Status
Not open for further replies.

moshpitMajor

New member
Joined
Nov 9, 2022
Messages
2
Programming Experience
Beginner
MVVM Pattern verwenden:

Leere Projektmappe erstellen

View - Wpf hinzufügen
Model - Klassenbibliothek
ViewModel - Klassenbibliothek

Verweis auf Klassen erstellen: View -> ViewModel -> Model

Model erstellen: Klasse erstellen mit getter/setter Konstruktor etc.

WPF in View erstellen

Im ViewModel VMMainWindow erstellen (Verknüpfung zur Oberfläche)
-> xmlns:vm="clr-namespace:ViewModel;assembly=ViewModel"
-> <Window.DataContext>
<vm:VMMainWindow/>
</Window.DataContext>

Projektmappe neu erstellen

in VMMainWindow int, string etc anlegen und getter/setter erstellen, anschliessend im WPF binden (z. B Text="{Binding Zahl}"

im ViewModel Klasse VM.. anlegen (z.B VMPerson)

using Model; einbinden

in VMPerson private Person person anlegen(Verweis und using Model nötig!)

Konstruktor erstellen für VMPerson -> Konstruktor wie bei normaler Person!
z.B. public VMPerson(string name)
{
person = new Person(name);
}
getter/setter wie bei normaler Person!
z.B. public string Name { get => person.Name; set => person.Name = value; }

Methoden verweisen auf Methode in klasse Person
z.B. public void Laufen()
{
person.Laufen();
}

Im MainWindow VMPerson anlegen und getter/setter für VMPerson anlegen

Binding erstellen
z.B. Text ="{Binding VMPerson.Strecke, Mode = OneWay} (OneWay wenn nur getter!)

Nun den Button Fahren einrichten:

in ViewModel neue Klasse UserCommand 1 mal erstellen (Für jeden zusätzlichen Button ein Objekt dieser Klasse erstellen)

using System.Windows.Input einbinden

: ICommand + schnittstellen implementieren mit rechtsklick

public UserCommand(Action<Object> action)
{
this.action = action;
}

einfügen

in der execute Methode:

if(parameter!=null)
{
action(parameter);
}

dann im VMMainWindow UserCommand userCommand anlegen und Konstruktor generieren

VMMainWindow Konstruktor erstellen und in ihn
VMPerson = new VMPerson("Hans");
strecke = 0;
userCommand = new UserCommand(new Action<objects>(VMLaufen));

Rechtsklick auf VMLaufen Methode und generieren lassen

in Methode folgendes :
VMPerson akt = (VMPerson)obj;
akt.Laufen();

Command an Button binden:
Command="{Binding Usercommand}" CommandParameter="{Binding VMPerson}"

in VMPerson : INotifyPropertyChanged hinzfügen und implementieren

public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}

Funktion in VMPerson folgendes hinzufügen:
OnPropertyChanged(new PropertyChangedEventArgs("Km"));





UserCommand:
public class UserCommand : ICommand
{
private Action<object> action;



public UserCommand(Action<Object> action)
{
this.action = action;
}


public event EventHandler CanExecuteChanged;

public bool CanExecute(object parameter)
{
throw new NotImplementedException();
}

public void Execute(object parameter)
{
if (parameter != null)
{
action(parameter);
}
}
}




public class VMMannschaft : INotifyPropertyChanged
{
private Mannschaft mannschaft;
public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}

public VMMannschaft(string nation)
{
mannschaft = new Mannschaft(nation);
}

public string Nation { get => mannschaft.Nation; set => mannschaft.Nation = value; }
public int Punkte { get => mannschaft.Punkte; set => mannschaft.Punkte= value; }
public int Spiel { get => mannschaft.Spiel; set => mannschaft.Spiel = value; }


public void Niederlage()
{
mannschaft.Niederlage();
OnPropertyChanged(new PropertyChangedEventArgs("Punkte"));
}

public void Sieg()
{
mannschaft.Sieg();
OnPropertyChanged(new PropertyChangedEventArgs("Punkte"));
}

public void Unentschieden()
{
mannschaft.Unentschieden();
OnPropertyChanged(new PropertyChangedEventArgs("Punkte"));
}



public class VMMainWindow
{
private string nation;
private int punkte;
private int spiel;
private VMMannschaft vMMannschaft;
UserCommand userCommand;

public VMMainWindow()
{
VMMannschaft = new VMMannschaft("Deutschland");
punkte= 0;
spiel= 0;
userCommand = new UserCommand(new Action<object>(VMSieg));
userCommand = new UserCommand(new Action<object>(VMNiederlage));
userCommand = new UserCommand(new Action<object>(VMUnentschieden));

}

private void VMUnentschieden(object obj)
{
VMMannschaft akt = (VMMannschaft)obj;
akt.Unentschieden();
}

private void VMNiederlage(object obj)
{
VMMannschaft akt = (VMMannschaft)obj;
akt.Niederlage();
}

private void VMSieg(object obj)
{
VMMannschaft akt = (VMMannschaft)obj;
akt.Sieg();
}

public string Nation { get => nation; set => nation = value; }
public int Punkte { get => punkte; set => punkte = value; }
public int Spiel { get => spiel; set => spiel = value; }
public VMMannschaft VMMannschaft { get => vMMannschaft; set => vMMannschaft = value; }
public UserCommand Usercommand { get => userCommand; set => userCommand = value; }
}




<Window x:Class="View.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:View"
xmlns:vm="clr-namespace:ViewModel;assembly=ViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">

<Window.DataContext>
<vm:VMMainWindow/>
</Window.DataContext>
 
Just like wrote in your other post: Unfortunately, this site is an English language forum. Please postin English. Also please put your code in code tags so that proper formatting/indentation is retained.
 
Status
Not open for further replies.

Latest posts

Back
Top Bottom