Problem mit WPF Data Binding Definiert im Code Keine Aktualisierung der UI-Elemente
Muss ich definieren neuen UI-Elemente sowie die Datenbindung im code, weil Sie umgesetzt werden nach run-time. Hier ist eine vereinfachte version von dem, was ich zu tun versuche.
Daten Modell:
public class AddressBook : INotifyPropertyChanged
{
private int _houseNumber;
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string sProp)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(sProp));
}
}
}
Bindung in Code:
AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); //Text block displays "123"
myGrid.Children.Add(tb);
book.HouseNumber = 456; //Text block displays "123" but PropertyChanged event fires
Wenn die ersten Daten gebunden ist, wird der text-block wird aktualisiert, mit der richtigen Hausnummer. Dann, wenn ich die Hausnummer im code später, das Buch-das PropertyChanged-Ereignis feuert, aber der Textblock wird nicht aktualisiert. Kann mir jemand sagen warum?
Dank,
Ben
- Haben Sie versucht, breakpoints zu setzen, um zu sehen, wenn Sie Erfolg erhalten, wenn Sie für die Eigenschaft?
- Ja, ich habe eine message-box aufpoppen, wenn das Buch-das PropertyChanged-Ereignis ausgelöst wird, das geschieht bei jedem Daten-update.
- interessanteste Antwort, IMO, ist die von @StevenRobbins , obwohl es undervoted und danach begraben innen andere Antworten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Wurzel es war, dass die Zeichenfolge, die ich übergeben, um PropertyChangedEventArgs nicht GENAU dem Namen der Eigenschaft. Ich hatte so etwas wie dieses:
Wo es sein sollte dieser:
Huch! Vielen Dank für den push in die richtige Richtung.
Stellen Sie sicher, dass die Aktualisierung der
AddressBook
Referenz, die verwendet wurde, in der Bindung, und nicht eine andereAddressBook
Referenz.Habe ich die folgenden arbeiten mit dem Adressbuch-code, den Sie gab.
Code hinter:
Hinweis: die gleiche Referenz verwendet wird, im update-code.
Tun, müssen Sie den binding-Modus ein Programm? Kann es sein, standardmäßig auf Einmalige.
BindingMode
Habe ich gerade geschnitten+geklebt code und fügte hinzu, ein wenig), und es funktioniert gut für mich:
Zeigt 456 auf Start, klicken auf die Schaltfläche bewirkt, dass die Zahl in den TextBlock Inkrement gut.
Vielleicht sind Sie auf der Suche an der falschen Stelle nach der Ursache des Problems?
Sind Sie sicher, dass Sie aktualisieren das gleiche Objekt wie die Sie verwendet haben, in der Bindung? Auf den ersten Blick nichts sieht, falsch ist, so überprüfen Sie die einfachen Dinge. 🙂
Nicht jeden code zu umgehen die Eigenschaft, das Feld (
_houseNumber
) direkt?