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>
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>