Ho una casella combinata con la fonte degli elementi allegata utilizzando l'associazione semplice. C'è un modo per aggiornare questa associazione una volta caricata la casella combinata?
Ho una casella combinata con la fonte degli elementi allegata utilizzando l'associazione semplice. C'è un modo per aggiornare questa associazione una volta caricata la casella combinata?
Risposte:
Puoi usare espressioni di associazione:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
Ma come ha notato Blindmeis puoi anche attivare le notifiche di modifica, inoltre se la tua raccolta implementa INotifyCollectionChanged
(ad esempio implementata in ObservableCollection<T>
) si sincronizzerà, quindi non è necessario fare nulla di tutto ciò.
se usi mvvm e il tuo itemssource si trova nel tuo vm. basta chiamare INotifyPropertyChanged per la proprietà della raccolta quando si desidera aggiornare.
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, ma dovrai mantenere la porta privata per quel wrapper e quindi devi scrivere una proprietà e un metodo per tutto su quella porta che usi altrove nel progetto per assicurarti che le proprietà su cui sei interessato a notificare passino sempre attraverso il wrapper
nameof(YourCollectionProperty)
al contrario di una stringa letterale. Ciò impedisce il refactoring dei bug ed è più esplicito ciò che è effettivamente inteso. Questo è ovviamente dove non puoi usare l' CallerMemberName
attributo che è ancora più bello
Per aggiungere i miei 2 centesimi, se vuoi aggiornare la tua fonte dati con il nuovo valore del tuo Control, devi chiamare UpdateSource()
invece di UpdateTarget()
:
((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
Prova a usare BindingExpression.UpdateTarget()
Recuperavo dati dal backend e aggiornavo lo schermo con una sola riga di codice. Ha funzionato. Non sono sicuro del motivo per cui dobbiamo implementare Interface. (Windows 10, UWP)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}