Zuerst möchte ich sagen, dass das folgende Beispiel zu stark vereinfacht ist. Angenommen, Sie haben WPF-Steuerelement gebunden.INotifyPropertyChanged Problem
<Window Title="Window1" Height="300" Width="300">
<Grid>
<StackPanel>
<TextBox Text="{Binding Name}" Margin="10"/>
<Button HorizontalAlignment="Center"
Content="Click Me" Margin="5"
Padding="2" Click="OnButtonClick" />
</StackPanel>
</Grid>
</Window>
Fenster wird auf die Klasse Person gebunden, die INotifyPropertyChanged
und hat Namen Setter in Form
public string Name
{
get { return _name; }
set
{
_name = "Some Name";
OnPropertyChanged("Name");
}
}
D. h implementiert _name wird "Some Name" zugewiesen, wenn der Benutzer versucht, ihn von der Benutzeroberfläche zu ändern. Aber dieses Beispiel funktioniert nicht. Ich änderte den Namen in TextBox in einen Wert, um die Schaltfläche zu drücken, um den Fokus auf den Button zu verschieben, und der Wert in TextBox bleibt unverändert, obwohl das PropertyChanged-Ereignis ausgelöst wurde.
Können Sie mir bitte erklären, warum es passiert? Wie ich verstehe PropertyChanged
Ereignis zwingt UI, Werte von Eigenschaften neu einzulesen und sie anzuzeigen, aber in meinem Beispiel Wert in datengebundenen Textfeld wird nicht aktualisiert.
Wieder. Ich verstehe, dass dies eine schlechte Umsetzung des Eigentums ist, aber ich möchte wiederholen, dass dies eine zu starke Vereinfachung ist. Es ist nur ein Beispiel. Wie auch immer, PropertyChanged signalisiert, dass die Eigenschaft geändert wurde und sollte aktualisiert werden, tut es aber nicht.
Äh, ich kann falsch sein, aber es sollte nicht sein '{Binding Path = Name}'? –
Nein. Bei Eigenschaftsbindungen können Sie Pfad als Verknüpfung auslassen. –
Dies liegt daran, dass Bindung einen Konstruktor hat, der den Pfad als Parameter verwendet. –