2016-07-01 13 views
0

ich eine Immobilie von einem Objekt auf ein Steuerelement gebunden, aber die Eigenschaft wird nicht aktualisiert ...WPF Databinding auf eine Eigenschaft von einem Objekt

ich auf diese Weise Triedit:

ViewModelBase:

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Ansichtsmodell:

public class VIewModel : ViewModelBase 
{ 
    private Person _person; 

    public Person Person 
    { 
     get { return _person; } 
     set 
     { 
      _person = value; 
      OnPropertyChanged(nameof(Person)); 
     } 
    } 
} 

Personclass:

public class Person 
{ 
    public string Name { get; set; } 
    public string FirstName { get; set; } 

} 

App.xamls.cs

protected override void OnStartup(StartupEventArgs e) 
{ 
    var viewModel = new VIewModel 
    { 
     Person = new Person{FirstName = "Dominik", Name = "Muster"} 
    }; 

    var window = new MainWindow {DataContext = viewModel}; 
    window.Show(); 
    base.OnStartup(e); 
} 

Mainwindow:

<StackPanel> 
    <TextBox Text="{Binding Person.Name}"/> 
    <TextBox Text="{Binding Person.FirstName}" Width="200"/> 
</StackPanel> 

Wenn das Programm gestartet wird, wird der Wert der Textfelder sind der Wert des Kontakt-Objekt, aber wenn ich Ändern Sie den Text-Wert in das Textfeld, die Eigenschaft wird nicht aktualisiert ... irgendwelche Ideen?

+2

Versucht das INotifyPropertyChanged in der Klasse Person zu implementieren? – CiccioRocca

+0

Sie müssen das Ansichtsmodell darüber informieren, wann die Eigenschaften aktualisiert werden sollen. Fügen Sie also in Ihrer Bindung den UpdateSourceTrigger hinzu und legen Sie ihn auf PropertyChanged fest, und Ihre Eigenschaften geben den Wert in den Textfeldern wieder: Text = "{Binding Person.Name, UpdateSourceTrigger = PropertyChanged , Modus = TwoWay} –

+0

@Sabrina_cs Ihre Lösung funktioniert nicht ... –

Antwort

1

Versuchen INotifyPropertyChanged In der Klasse Person Implement:

public class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _name; 
    private string _firstName; 

    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 


public string FirstName 
{ 
    get 
    { 
     return _firstName; 
    } 
    set 
    { 
     _firstName = value; 
     OnPropertyChanged("FirstName"); 
    } 
} 

protected void OnPropertyChanged(string name) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(name)); 
} 

}