Hallo,
irgendwie sehe ich gerade den Wald vor lauter Bäumen nicht.
Also wenn ich in der cs Datei die Save_Click Aktion auslöse, wird das Obejkt user mit neuen Daten aktualisiert (funktioniert und getestet mithilfe von "Console.WriteLine(user.Lastname)". Aber der Content der Label bleibt leer und aktualisiert sich nicht. Was habe ich vergessen?
<Grid Style="{StaticResource FormGrid}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Vorname:"/>
<Label Grid.Row="0" Grid.Column="1" Content="{Binding Firstname}"/>
<Label Grid.Row="1" Grid.Column="0" Content="Nachname:"/>
<Label Grid.Row="1" Grid.Column="1" Content="{Binding Lastname}"/>
</Grid>
In der cs Datei (gekürzt):
namespace resper.LaMa.Pages.Admin
{
public partial class NewAccount : Page
{
UserModel user;
public NewAccount()
{
InitializeComponent();
this.DataContext = user;
}
private void Save_Click(object sender, RoutedEventArgs e)
{
user = MainWindow.sqlHelper.NewUser(Firstname.Text, Lastname.Text);
}
}
}
Das UserModel sieht so aus (gekürzt):
public class UserModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _Firstname;
public string Firstname
{
get { return _Firstname; }
set
{
if (_Firstname != null && !_Firstname.Equals(value))
{
IsDirty = true;
}
_Firstname = value;
OnPropertyChanged("Firstname");
}
}
private string _Lastname;
public string Lastname
{
get { return _Lastname; }
set
{
if(_Lastname != null && !_Lastname.Equals(value))
{
IsDirty = true;
}
_Lastname = value;
OnPropertyChanged("Lastname");
}
}
public UserModel() { }
private void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
Hi resper,
Fehler, die durch DataBinding verursacht werden, findest du während der Laufzeit im Ausgabefenster.
Siehe auch den Abschnitt Debugging in [Artikel] MVVM und DataBinding
Edit: Die View bekommt von der Änderung der user-Variable nichts mit, denn erstens funktioniert DataBinding nur mit Eigenschaften, und zweitens mußt du dafür auch INotifyPropertyChanged implementieren, und drittens müßtest du auch den DataContext neu setzen. Ich würde dir empfehlen, dich erstmal mit MVVM auseinanderzusetzen.
Weeks of programming can save you hours of planning
Ich finde keine Fehlermeldung im Ausgabefenster. Da erscheint nur die Meldung des
Console.WriteLine(user.Lastname);
den ich nach
user = MainWindow.sqlHelper.NewUser(Firstname.Text, Lastname.Text);
eingefügt habe.
Du aktualisierst nur die Variable "user", nicht den DataContext.
Im DataContext bleibt das, was vorher in "user" stand, sprich null
Du solltest das allerdings auch etwas anders machen.
Erstelle für die View ein weiteres ViewModel.
Darin gibt's eine Property namens User (mit Notification).
Außerdem enthält es einen Command, der einen neuen User erzeugt.
An deinem Button bindest Du dann die Command-Property an den Command im ViewModel und dort, wo Du den User brauchst, bindest Du an die User-Property.
public User MyUser
{
get { ... }
set { ... }
}
public ICommand CreateNewUserCommand { get; }
public MyCoolViewModel()
{
CreateNewuserCommand = new RelayCommand(p => CreateNewUser());
// Siehe: http://www.c-sharpcorner.com/UploadFile/20c06b/icommand-and-relaycommand-in-wpf/
}
private void CreateNewUser()
{
User = ...
}
<Grid>
<Label Grid.Row="0" Grid.Column="0" Content="Vorname:"/>
<Label Grid.Row="0" Grid.Column="1" Content="{Binding MyUser.Firstname}"/>
<Label Grid.Row="1" Grid.Column="0" Content="Nachname:"/>
<Label Grid.Row="1" Grid.Column="1" Content="{Binding MyUser.Lastname}"/>
</Grid>
<Button Command="{Binding CreateNewUserCommand}" />
So bleibt die Kontrolle im ViewModel.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Mit dem MVVM hardere ich noch. Versuche es bei einem anderen Projekt umzusetzen, aber bin da etwas begriffsstutzig.
Habe schon mithilfe des Tutorial hier im Forum und aus meinem Buch (C# mit Visual Studio 2015) dran gebastelt. Aber klappt noch nicht so alles wie ich das will und verstehe auch einige Zusammenhänge nicht bzw. finde es teilweise für mein kleines Projekt zu umfangreich.
Mit dem MVVM hardere ich noch. Versuche es bei einem anderen Projekt umzusetzen, aber bin da etwas begriffsstutzig.
Du verwendest schon INotifyPropertyChanged und DataBinding in XAML. Das ist alles, was man für MVVM benötigt. Man muß es nur strukturiert anwenden, und nicht View, Model und Datenzugriffsschicht durcheinanderbringen.
Wenn du MVVM lernen und verstehen möchstest, würde ich dich dazu ermutigen, deine Fragen dazu hier im Forum zu stellen.
Weeks of programming can save you hours of planning