Guten Abend alle zusammen,
(Vorweg: Ich habe bis jetzt immer alles an Code in die CodeBehind-Daten geschrieben und mich bisher noch nicht mit folgendem beschäftigt.)
ich habe ein kleines Problem in einer kleinen Anwendung und hoffe einer von euch kann mir helfen.
Ich habe eine Klasse Benutzer:
In der Klasse habe ich nun erstmal nur Vor- und Nachname als Eigenschaft angelegt.
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Benutzerverwaltung.Model
{
public class Benutzer
{
private string _firstName;
private string _lastName;
public Benutzer(string firstName, string lastName)
{
if (string.IsNullOrWhiteSpace(firstName)) throw new ArgumentNullException("givenName");
if (string.IsNullOrWhiteSpace(lastName)) throw new ArgumentNullException("sn");
_firstName = firstName;
_lastName = lastName;
Console.WriteLine("Benutzer");
}
public string FirstName
{
set { _firstName = value;
Console.WriteLine(_firstName);
}
get { return _firstName; }
}
public string LastName
{
set { _lastName = value;
Console.WriteLine(_lastName);
}
get { return _lastName; }
}
}
}
ViewModel: In der vererbten Klasse hab ich das INotifyPropertyChanged Event erstellt, was auch funktioniert.
(Wenn ich eine neue Property im ViewModel erstelle und binde funktioniert es)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Benutzerverwaltung.Model;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace Benutzerverwaltung.ViewModel
{
public class BenutzerViewModel : BaseViewModel
{
private Benutzer _benutzer;
public BenutzerViewModel(Benutzer benutzer)
{
_benutzer = benutzer;
}
public BenutzerViewModel()
{ }
public Benutzer Benutzer
{
set { _benutzer = value; }
get { return _benutzer; }
}
}
}
Dann hab ich ein UserControl:
Hier hab ich den DataContext auf mein ViewModel gesetzt und meine beiden TextBoxen darüber "gebunden"
<UserControl x:Class="Benutzerverwaltung.Views.StudentView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Benutzerverwaltung.Views"
xmlns:viewModel="clr-namespace:Benutzerverwaltung.ViewModel"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<viewModel:BenutzerViewModel />
</UserControl.DataContext>
<Grid>
<StackPanel HorizontalAlignment = "Left">
<StackPanel Orientation = "Vertical">
<TextBox Text = "{Binding Path=Benutzer.LastName}" Width = "100" Margin = "3 5 3 5"/>
<TextBox Text = "{Binding Path=Benutzer.FirstName}" Width = "100" Margin = "3 5 3 5"/>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>
Ich möchte nun die Werte der TextBoxen über das ViewModel an das Model (Benutzer) senden. Leider funktioniert das so wie ich es aufgebaut habe nicht. Eine Fehlermeldung bekomme ich jedoch auch nicht.
Ich könnte natürlich für Vor- und Nachname im ViewModel eigene Setter/Getter erstellen, aber das sollte doch so auch funktionieren oder liege ich da falsch?
(Es sollen noch weitere Eigenschaften hinzukommen, sodass es mit den vielen Settern/Gettern unübersichtlich werden würde)
Ich hoffe ich hab das halbwegs gut beschrieben und jemand kannst mir helfen. Mit würde auch ein Suchbegriff reichen.
Viele grüße
Moechen
Hallo Moechen,
Bei Deinen Properties im Model, sowie im ViewModel (Benutzer) INotifyPropertyChanged implementieren/aufrufen.
public string FirstName
{
get { return _firstName; }
set
{
if (Equals(_firstName, value)) return;
_firstName = value;
OnPropertyChanged();
}
}
Gruss Lhyn
Hallo Moechen,
ViewModel: In der vererbten Klasse hab ich das INotifyPropertyChanged Event erstellt, was auch funktioniert.
(Wenn ich eine neue Property im ViewModel erstelle und binde funktioniert es)
Das INotifyPropertyChanged ist nicht dazu da, dass die Werte gebunden werden. Es dient dazu, dass Änderungen im Viewmodel an der View angezeigt werden.
Daher implementiere das INP und ruf es auf, wie lhyn schon sagte.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Eine Fehlermeldung bekomme ich jedoch auch nicht.
Fehlermeldungen/Warnungen bzgl. XAML stehen meistens im Output. =)
Ich würde Dir Fody/PorpertyChanged empfehlen. Das implementiert Dir das automatisch im Hintergrund und hält den Code kompakt.
Man muss auch noch sagen, dass hier nicht die Werte aus dem ViewModel, sondern die Werte aus dem Model gebunden werden sollen.
Empfehlen würde ich das so nicht.
Hallo zusammen,
vielen Dank schonmal für eure Antworten.
Wenn das so, wie ich es probiert hatte nicht funktioniert, gibt es einen "besten weg" mit mehreren
TextBoxen umzugehen ohne für jede in dem ViewModel und Model einen Getter/Setter zu erstellen?
Das ich im Model einen brauche ist mir bewusst, aber auch im ViewModel?
VG
Moechen
Das ViewModel repräsentiert Deine Ansicht.
Alles, was Du dort eingeben kannst oder dort dynamisch angezeigt werden soll, muss es im ViewModel auch geben.
Dein Model hat damit nichts zutun.
Dein Model spielt in der Ansicht keine Rolle und sollte dort gar nicht zu finden sein - nur das ViewModel.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code