98 votes

Pourquoi est-ReadOnlyObservableCollection.CollectionChanged pas public?

Pourquoi est - ReadOnlyObservableCollection.CollectionChanged protégés et ne sont pas publiques (comme la correspondante ObservableCollection.CollectionChanged est)?

Qu'est-ce que l'utilisation d'une collection d'exécution INotifyCollectionChanged si je ne peux pas accéder à l' CollectionChanged événement?

64voto

Nick Points 1818

Voici la solution: CollectionChanged événements sur ReadOnlyObservableCollection

Vous avez à la fonte de la collection INotifyCollectionChanged.

20voto

Restuta Points 4476

J'ai trouvé un moyen pour vous de comment faire ceci:

ObservableCollection<string> obsCollection = new ObservableCollection<string>();
INotifyCollectionChanged collection = new ReadOnlyObservableCollection<string>(obsCollection);
collection.CollectionChanged += new NotifyCollectionChangedEventHandler(collection_CollectionChanged);

Vous avez juste besoin de faire référence à votre collection explicitement par INotifyCollectionChanged interface.

8voto

Jason Young Points 1

Je sais que ce post est vieux, cependant, les gens doivent prendre leur temps pour comprendre la nature des modèles utilisés .NET avant de commenter. Une lecture que la collection est un wrapper sur une collection existante qui empêche les consommateurs de le modifier directement, regardez - ReadOnlyCollection et vous verrez que c'est un wrapper sur un IList<T> qui peut ou peut ne pas être sujette au changement. Immuable collections sont une autre affaire et sont couverts par la nouvelle immuable des collections de la bibliothèque

En d'autres termes, en lecture seule n'est pas la même que immuables!!!!

Cela mis à part, ReadOnlyObservableCollection doit implicitement mettre en oeuvre INotifyCollectionChanged.

5voto

porcus Points 183

Il y a certainement de bonnes raisons pour vouloir s'abonner à la collection de changé les notifications sur un ReadOnlyObservableCollection. Donc, comme une alternative de simplement le moulage de votre collection comme INotifyCollectionChanged, si vous arrive d'être sous-classement ReadOnlyObservableCollection, alors voici un point de vue syntaxique moyen pratique d'accéder à l'un CollectionChanged événement:

    public class ReadOnlyObservableCollectionWithCollectionChangeNotifications<T> : ReadOnlyObservableCollection<T>
{
    public ReadOnlyObservableCollectionWithCollectionChangeNotifications(ObservableCollection<T> list)
        : base(list)
    {
    }

    event System.Collections.Specialized.NotifyCollectionChangedEventHandler CollectionChanged2
    {
        add { CollectionChanged += value; }
        remove { CollectionChanged -= value; }
    }
}

Cela a bien fonctionné pour moi avant.

5voto

jbe Points 4629

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