Добавить CollectionChanged в ObservableColleciton, не зная типа коллекции

Я пытаюсь добавить событие CollectionChanged к любому элементу в классе. Предположим, у меня есть следующее:

public class A
{
   string OneString;
   string TwoString;
   ObservableCollection<B> CollectionOfB;
}

public class B
{
   string ThreeString;
   string FourString;
   string FiveString;
   ObservableCollection<C> CollectionOfC;
}

public class C
{
   string SixString;
   string SevenString;
}

Мой код в настоящее время начинается с класса A и просматривает каждый элемент в классе, который использует INotifyPropertyChanged, назначает события PropertyChanged каждому элементу и рекурсивно детализирует каждый подкласс, назначая события PropertyChanged на каждом уровне.

Моя проблема заключается в том, что я пытаюсь назначить события CollectionChanged для ObservableCollection. Мой код не будет знать тип элемента в ObservableColleciton до времени выполнения. У меня есть следующий код:

protected virtual void RegisterSubPropertyForChangeTracking(INotifyPropertyChanged propertyObject)
{
    propertyObject.PropertyChanged += new PropertyChangedEventHandler(propertyObject_PropertyChanged);

    // if this propertyObject is also an ObservableCollection then add a CollectionChanged event handler
    if (propertyObject.GetType().GetGenericTypeDefinition().Equals(typeof(ObservableCollection<>)))
    {
        ((ObservableCollection<object>)propertyObject).CollectionChanged +=
            new NotifyCollectionChangedEventHandler(propertyObject_CollectionChanged);
    }
}

Когда я пытаюсь добавить обработчик событий CollectionChanged, я получаю следующую ошибку:

{"Unable to cast object of type 'System.Collections.ObjectModel.ObservableCollection`1[SOC.Model.Code3]' to type 'System.Collections.ObjectModel.ObservableCollection`1[System.Object]'."}

Как я могу добавить обработчик события CollectionChanged, не зная типа класса до времени выполнения


person BrianKE    schedule 23.10.2013    source источник


Ответы (1)


Просто примените его к INotifyCollectionChanged

var collectionChanged = propertyObject as INotifyCollectionChanged;
if (collectionChanged != null)
    collectionChanged.CollectionChanged += ...
person Eli Arbel    schedule 23.10.2013