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?

Techee
quelle
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.

HB
quelle
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");
blindmeis
quelle
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();
Punkt net
quelle
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();
}
Tempeck
quelle
6

Versuchen Sie es mit BindingExpression.UpdateTarget()

Kushal Waikar
quelle
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();
    }
Itzdsp
quelle
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