Eu tenho uma caixa de combinação com fonte de itens anexada usando ligação simples. Existe alguma maneira de atualizar esta ligação depois que a caixa de combinação é carregada?
Eu tenho uma caixa de combinação com fonte de itens anexada usando ligação simples. Existe alguma maneira de atualizar esta ligação depois que a caixa de combinação é carregada?
Respostas:
Você pode usar expressões de ligação:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
Mas, como Blindmeis observou, você também pode disparar notificações de alteração, além disso, se sua coleção for implementada INotifyCollectionChanged
(por exemplo, implementada no ObservableCollection<T>
), ela será sincronizada, portanto, você não precisa fazer nada disso.
se você usa mvvm e sua fonte de itens está localizada em sua VM. apenas chame INotifyPropertyChanged para sua propriedade de coleção quando quiser atualizar.
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, mas você terá que manter a porta privada para esse wrapper e, portanto, precisa escrever uma propriedade e método para tudo nessa porta que você usa em outro lugar no projeto para garantir que as propriedades que você está interessado em notificar sempre passam pelo wrapper
nameof(YourCollectionProperty)
ao invés de uma string literal. Isso evita que os bugs sejam refatorados e é mais explícito o que realmente se pretende. É claro que aqui você não pode usar o CallerMemberName
atributo que é ainda melhor
Para adicionar meus 2 centavos, se você deseja atualizar sua fonte de dados com o novo valor de seu Controle, você precisa chamar em UpdateSource()
vez de UpdateTarget()
:
((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
Tente usar BindingExpression.UpdateTarget()
Eu estava buscando dados do back-end e atualizei a tela com apenas uma linha de código. Funcionou. Não tenho certeza, por que precisamos implementar a Interface. (Windows 10, UWP)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}