200 votes

ObservableCollection, ne pas avoir remarqué quelle rubrique il change (même avec INotifyPropertyChanged)

est-ce que quelqu'un sait pourquoi ce code ne fonctionne pas :

PS : ViewModelBase abonnement contient tout pour RaisePropertyChanged etc. et ça fonctionne pour tout le reste sauf ce problème...

195voto

simon Points 1025

Voici une classe occasionnelle qui sous-classes ObservableCollection et effectivement déclenche une action de remise à zéro lorsqu’une propriété sur un élément de liste change. Elle applique tous les éléments à mettre en œuvre `` .

L’avantage ici est que vous pouvez lier des données à cette classe et toutes vos liaisons mettra à jour avec les modifications apportées à vos propriétés de l’élément.

137voto

Martin Harris Points 18057

Le ContentList de la méthode de Jeu ne sera pas appelée lorsque vous modifiez une valeur à l'intérieur de la collection, au lieu de cela, vous devriez être à la recherche pour le CollectionChanged événement de tir.

public class CollectionViewModel : ViewModelBase
{          
    public ObservableCollection<EntityViewModel> ContentList
    {
        get { return _contentList; }
    }

    public CollectionViewModel()
    {
         _contentList = new ObservableCollection<EntityViewModel>();
         _contentList.CollectionChanged += ContentCollectionChanged;
    }

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        //This will get called when the collection is changed
    }
}

MODIFIER

Ok, ça fait deux fois aujourd'hui, j'ai été mordu par la documentation MSDN avoir tort. Dans le lien que je vous ai donné, il dit:

Se produit lorsqu'un élément est ajouté, supprimé, modifiés, déplacés, ou de l'ensemble de la liste est actualisé.

Mais en fait elle n'a pas d' incendie lorsqu'un élément est modifié. Je suppose que vous aurez besoin d'un plus bruteforce méthode, puis:

public class CollectionViewModel : ViewModelBase
{          
    public ObservableCollection<EntityViewModel> ContentList
    {
        get { return _contentList; }
    }

    public CollectionViewModel()
    {
         _contentList = new ObservableCollection<EntityViewModel>();
         _contentList.CollectionChanged += ContentCollectionChanged;
    }

    public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach(EntityViewModel item in e.OldItems)
            {
                //Removed items
                item.PropertyChanged -= EntityViewModelPropertyChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach(EntityViewModel item in e.NewItems)
            {
                //Added items
                item.PropertyChanged += EntityViewModelPropertyChanged;
            }     
        }       
    }

    public void EntityViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        //This will get called when the property of an object inside the collection changes
    }
}

Si vous allez avoir besoin de beaucoup vous pouvez sous-classe votre propre ObservableCollection qui déclenche l'événement CollectionChanged lorsqu'un membre déclenche son événement PropertyChanged automatiquement (comme il dit il doit dans la documentation...)

21voto

Jack Kenyon Points 121

Il utilise les idées ci-dessus mais, ce qui la rend une dérivée collection « plus sensible » :

18voto

mjeanes Points 706

ObservableCollection n’est pas repropagées modifications des articles individuels en tant qu’événements CollectionChanged. Vous aurez soit besoin de s’abonner à chaque événement et transmettre manuellement, ou vous pouvez consulter la classe BindingList [T] , qui fera pour vous.

7voto

Swab.Jat Points 209

Ajoute l’événement TruelyObservableCollection « ItemPropertyChanged » :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X