WPF: Liste de liaison à ListBox
J'ai une classe:
public class A : INotifyPropertyChanged
{
public List<B> bList { get; set; }
public void AddB(B b)
{
bList.Add(b);
NotifyPropertyChanged("bList");
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
De liaison et d'un (DataContext de UserControl est Une instance de):
<ListBox ItemsSource="{Binding Path=bList}" />
Éléments sont présentés, la zone de liste n'est pas mis à jour après le nouvel objet est ajouté à la Liste
Après la modification de la liste de ObservableCollection et la suppression de la NotifyPropertyChanged gestionnaire tout fonctionne.
Pourquoi la liste n'est pas de travail?
source d'informationauteur Damian
Vous devez vous connecter pour publier un commentaire.
Votre propriété doit êtrepublic
ou le moteur de liaison ne sera pas en mesure d'y accéder.EDIT:
C'est précisément pourquoi l'
ObservableCollection<T>
de classe a été introduit...ObservableCollection<T>
implémenteINotifyCollectionChanged
ce qui permet de notifier l'INTERFACE utilisateur lorsqu'un élément est ajouté/supprimé/remplacé.List<T>
ne déclenche pas toute notification, de sorte que l'INTERFACE utilisateur ne peut pas détecter lorsque le contenu de la liste a changé.Le fait que vous soulevez le
PropertyChanged
événement ne actualisation de la liaison, mais ensuite il se rend compte que c'est la même instance deList<T>
comme avant, de sorte qu'il réutilise la mêmeICollectionView
comme leItemsSource
et le contenu de laListBox
n'est pas actualisé.Première pensée est que vous êtes en essayant de se lier à un membre privé. Que certainement il ne semble pas juste.
Je pense que le problème est que, même si vous informez le cadre contraignant de la propriété a changé, la valeur réelle de la propriété reste le même. C'est-à-dire que, bien que la zone de liste peut réévaluer la valeur de son ItemsSource de liaison, il va trouver que c'est toujours le même instance de l'objet comme précédemment. Par exemple, imaginez que la zone de liste réagit par à la propriété a changé de cas en quelque sorte similaire à ci-dessous.
Dans votre exemple, cela signifierait qu'il ne serait pas réévaluer les éléments.
Remarque: je n'ai pas savoir comment la zone de liste fonctionne avec la propriété ItemsSource - je suis juste spéculer!
ObservableCollections envoyer CollectionChanged événements à ne pas PropertyChanged événements
Par la signalisation
vous êtes essentiellement en disant: vous avez un nouveau liste objet, non pas que le contenu de la Liste a changé.
Si vous Modifiez le type de ObservableCollection, les collections envoie automatiquement
notifications que la collection éléments ont changé, ce qui est ce que vous voulez.