У меня есть поле со списком с источником элементов, прикрепленным с помощью простой привязки. Есть ли способ обновить эту привязку после загрузки поля со списком?
У меня есть поле со списком с источником элементов, прикрепленным с помощью простой привязки. Есть ли способ обновить эту привязку после загрузки поля со списком?
Ответы:
Вы можете использовать выражения привязки:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
Но, как заметил Блиндмейс, вы также можете запускать уведомления об изменениях, кроме того, если ваша коллекция реализуется INotifyCollectionChanged
(например, реализована в ObservableCollection<T>
), она будет синхронизироваться, поэтому вам не нужно ничего делать из этого.
если вы используете mvvm и ваш источник элементов находится в вашем vm. просто вызовите INotifyPropertyChanged для своего свойства коллекции, когда хотите обновить.
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, но вам придется оставить порт частным для эту оболочку и, следовательно, необходимо написать свойство и метод для всего на этом порту, который вы используете в другом месте проекта, чтобы гарантировать, что свойства, которые вы хотите уведомить, всегда проходят через оболочку
nameof(YourCollectionProperty)
буквальной строки. Это предотвращает рефакторинг ошибок и более ясно показывает, что на самом деле задумано. Это, конечно, где вы не можете использовать CallerMemberName
атрибут, который даже лучше
Чтобы добавить мои 2 цента, если вы хотите обновить свой источник данных новым значением вашего элемента управления, вам нужно 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();
}