J'ai une zone de liste déroulante avec la source des éléments attachée en utilisant une liaison simple. Existe-t-il un moyen d'actualiser cette liaison une fois la zone de liste déroulante chargée?
J'ai une zone de liste déroulante avec la source des éléments attachée en utilisant une liaison simple. Existe-t-il un moyen d'actualiser cette liaison une fois la zone de liste déroulante chargée?
Réponses:
Vous pouvez utiliser des expressions de liaison:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
Mais comme Blindmeis l'a noté, vous pouvez également déclencher des notifications de changement, de plus si votre collection implémente INotifyCollectionChanged
(par exemple implémentée dans le ObservableCollection<T>
), elle se synchronisera afin que vous n'ayez rien à faire de cela.
si vous utilisez mvvm et que votre source d'éléments se trouve dans votre vm. appelez simplement INotifyPropertyChanged pour votre propriété de collection lorsque vous souhaitez actualiser.
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
, mais vous devrez garder le port privé pour ce wrapper et donc besoin d'écrire une propriété et une méthode pour tout sur ce port que vous utilisez ailleurs dans le projet pour vous assurer que les propriétés que vous souhaitez notifier passent toujours par le wrapper
nameof(YourCollectionProperty)
par opposition à une chaîne littérale. Cela empêche les bogues de refactoriser et est plus explicite ce qui est réellement prévu. C'est bien sûr là que vous ne pouvez pas utiliser l' CallerMemberName
attribut qui est encore plus agréable
Pour ajouter mes 2 cents, si vous souhaitez mettre à jour votre source de données avec la nouvelle valeur de votre Control, vous devez appeler UpdateSource()
au lieu de UpdateTarget()
:
((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
Essayez d'utiliser BindingExpression.UpdateTarget()
J'étais en train de récupérer des données depuis le backend et j'ai mis à jour l'écran avec une seule ligne de code. Ça a marché. Je ne sais pas pourquoi nous devons implémenter Interface. (Windows 10, UWP)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}