Mam pole kombi z dołączonym źródłem elementów za pomocą prostego wiązania. Czy istnieje sposób, aby odświeżyć to powiązanie po załadowaniu pola kombi?
Mam pole kombi z dołączonym źródłem elementów za pomocą prostego wiązania. Czy istnieje sposób, aby odświeżyć to powiązanie po załadowaniu pola kombi?
Odpowiedzi:
Możesz użyć wyrażeń wiążących:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
Ale jak zauważył Blindmeis, możesz również odpalać powiadomienia o zmianach, co więcej, jeśli twoja kolekcja implementuje INotifyCollectionChanged
(na przykład zaimplementowano w ObservableCollection<T>
), zsynchronizuje się, więc nie musisz tego robić.
jeśli używasz mvvm, a twoje itemsource znajduje się w twoim vm. po prostu wywołaj INotifyPropertyChanged dla swojej właściwości kolekcji, gdy chcesz odświeżyć.
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, ale będziesz musiał zachować ten port jako prywatny że wrapper, a zatem trzeba napisać nieruchomości i sposób wszystko na tym porcie użyć gdzie indziej w projekcie, aby zapewnić, że właściwości jesteś zainteresowany powiadamiania na zawsze przejść przez owinięcie
nameof(YourCollectionProperty)
w przeciwieństwie do dosłownego ciągu. Zapobiega to refaktoryzacji błędów i jest bardziej jasne, co jest faktycznie zamierzone. Tutaj oczywiście nie można użyć CallerMemberName
atrybutu, który jest jeszcze ładniejszy
Aby dodać moje 2 centy, jeśli chcesz zaktualizować swoje źródło danych o nową wartość swojej Kontroli, musisz zadzwonić UpdateSource()
zamiast UpdateTarget()
:
((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
Spróbuj użyć BindingExpression.UpdateTarget()
Pobierałem dane z zaplecza i aktualizowałem ekran za pomocą tylko jednej linii kodu. Zadziałało. Nie jestem pewien, dlaczego musimy wdrożyć Interface. (Windows 10, UWP)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}