У мене є комбо-поле з джерелом елементів, що додається за допомогою простого прив'язки. Чи є спосіб оновити цю палітурку після завантаження комбінованого вікна?
У мене є комбо-поле з джерелом елементів, що додається за допомогою простого прив'язки. Чи є спосіб оновити цю палітурку після завантаження комбінованого вікна?
Відповіді:
Ви можете використовувати вирази, що зв'язують:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
Але, як зауважив Blindmeis, ви також можете запускати сповіщення про зміни, якщо далі ваша колекція реалізується INotifyCollectionChanged
(наприклад, реалізована в програмі ObservableCollection<T>
), вона синхронізується, тому вам не потрібно нічого робити.
якщо ви використовуєте mvvm, а ваш itemssource знаходиться у вашому vm. просто зателефонуйте INotifyPropertyChanged для своєї власності колекції, коли ви хочете оновити.
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, але вам доведеться зберігати порт приватним цій обгортці і, таким чином, потрібно написати властивість та метод для всього цього порту, який ви використовуєте в іншому місці проекту, щоб гарантувати, що властивості, про які ви хочете повідомити, завжди проходять через обгортку
nameof(YourCollectionProperty)
на відміну від буквального рядка. Це запобігає рефакторингу помилок і більш чітко визначає, що насправді призначено. Це, звичайно, там, де ви не можете використовувати CallerMemberName
атрибут, який є ще приємнішим
Щоб додати мої 2 центи, якщо ви хочете оновити джерело даних новим значенням вашого Control, вам потрібно зателефонувати UpdateSource()
замість UpdateTarget()
:
((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
Спробуйте використовувати BindingExpression.UpdateTarget()
Я отримував дані з бекенда та оновлював екран лише одним рядком коду. Це спрацювало. Не впевнений, навіщо нам реалізовувати інтерфейс. (windows 10, UWP)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}