Wie erzwinge ich eine Aktualisierung einer WPF-Bindung?


112

Ich habe ein Kombinationsfeld mit einer Artikelquelle, die durch einfaches Binden angehängt wurde. Gibt es eine Möglichkeit, diese Bindung nach dem Laden des Kombinationsfelds zu aktualisieren?


1
Was meinst du mit einfacher Bindung? Normalerweise sollte das Steuerelement bei Verwendung der Bindung automatisch aktualisiert werden.
Erno

12
Techee, nichts für ungut, aber ich glaube, HB hat es verdient, dass seine Antwort akzeptiert wird ;-)
Dani

1
@Dani Ich bin nicht sicher, ob Techee jemals zurückkommt - sechseinhalb Jahre, seit er eingeloggt ist
The Lonely Coder

Antworten:


197

Sie können verbindliche Ausdrücke verwenden:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

Aber wie Blindmeis bemerkt man kann auch Feuer Änderungsbenachrichtigungen, weiter , wenn Ihre Sammlung Geräte INotifyCollectionChanged(zum Beispiel in der Umsetzung ObservableCollection<T>) wird es synchronisieren , so dass Sie nicht irgendetwas davon zu tun brauchen.


Scheint nichts für mich zu tun, wenn ich eine ListBox benutze.
Jonathan Wood

@ JonathanWood: Nun, ich kann nicht erraten, welche Art von Code Sie haben, einschließlich wie Ihre Bindung aussieht. Funktioniert die Bindung überhaupt?
HB

56

Wenn Sie mvvm verwenden und sich Ihre itemssource in Ihrer vm befindet. Rufen Sie einfach INotifyPropertyChanged für Ihre Sammlungseigenschaft auf, wenn Sie eine Aktualisierung durchführen möchten.

OnPropertyChanged("YourCollectionProperty");

7
Dies ist der sauberste Ansatz imho.
Ash

Dies sollte nach Möglichkeit erfolgen, es sollte jedoch beachtet werden, dass dies nicht immer praktikabel ist. Wenn Sie beispielsweise an eine serielle Schnittstelle binden und überprüfen möchten, ob diese offen, geschlossen, die Baudrate usw. ist, können Sie eine Wrapper-Klasse um die implementierte serielle Schnittstelle erstellen INotifyPropertyChanged, die Sie jedoch für privat halten müssen Dieser Wrapper muss daher eine Eigenschaft und Methode für alles an diesem Port schreiben, den Sie an anderer Stelle im Projekt verwenden, um sicherzustellen, dass die Eigenschaften, über die Sie benachrichtigt werden möchten, immer den Wrapper durchlaufen
Assimilater

7
Außerdem bin ich ein großer Fan von Verwendung nameof(YourCollectionProperty)im Gegensatz zu einer wörtlichen Zeichenfolge. Dies verhindert, dass Fehler umgestaltet werden, und ist expliziter, was tatsächlich beabsichtigt ist. Dies ist natürlich, wo Sie das CallerMemberNameAttribut nicht verwenden können , das noch schöner ist
Assimilater

31

Um meine 2 Cent hinzufügen, wenn Sie Ihre Datenquelle mit dem neuen Wert von Ihrem Control aktualisieren möchten, müssen Sie rufen UpdateSource()statt UpdateTarget():

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
Diese Antwort gefällt mir besser.
Chopnut

8

MultiBinding freundliche Version ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

Ich habe Daten aus dem Backend abgerufen und den Bildschirm mit nur einer Codezeile aktualisiert. Es funktionierte. Ich bin mir nicht sicher, warum wir Interface implementieren müssen. (Windows 10, UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

This.Bindings.update () aktualisiert alle Bindungen auf dem Bildschirm. Zu
Ihrer Information

Ich habe this.Bindings.Update () in einer Benutzersteuerung in UWP ausprobiert und es existiert nicht.
James Esh

Ja. Und das. Bindungen existieren noch nicht.
James Esh

2
Bindings.Update () ist nur verfügbar, wenn die kompilierten Bindungen (x: Bind) verwendet werden ... und kompilierte Bindungen sind nur in UWP verfügbar
Marian Dolinský

Bitte werfen Sie einen Blick auf @ MarianDolinský Kommentar. Sieht aus wie Sie von xaml binden müssen
Itzdsp
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.