Как пользовательский итератор может уведомлять подписчиков об изменениях своих итерированных элементов (например, "INotifyCollectionChanged")?

Мы пытаемся представить содержимое двух дочерних коллекций как дополнительное, всеобъемлющее IEnumerable имущество. Люди предложили использовать CompositeCollection для этого случая, но есть две проблемы:

  1. Там, кажется, не только для чтения вариант, но даже если бы были...
  2. Это не очень подходит для слоя модели из-за его зависимости от System.Windows.Data

Вместо этого моя мысль состоит в том, чтобы использовать IEnumerable реализация. Вот вымышленный пример, демонстрирующий концепцию...

public class Pets : INotifyPropertyChanged {
    public ObservableCollection<string> Dogs { get; } = new ObservableCollection<string>();
    public ObservableCollection<string> Cats { get; } = new ObservableCollection<string>();

    public IEnumerable All{
        get {
            // Cats go first because dogs always follow! ;)
            foreach(var cat in Cats)
                yield return cat;
            foreach(var dog in Dogs)
                yield return dog;
        }
    }
}

Хотя это и перечисляет всех детей по желанию, проблема, которую я вижу, состоит в том, что All не знает и не уведомляет об изменениях в Dogs или же Cats так как он не реализует INotifyCollectionChanged или даже INotifyPropertyChanged*, заставляя меня задуматься, если это правильный путь, во-первых.

* На самом деле это было бы довольно легко "прикрепить". Просто подпишитесь на INotifyCollectionChanged событие на Dogs а также Cats и поднять уведомление об изменении All при обработке любого из этих событий. Но это все или ничего, но я не уверен, что это правильный путь.

Моей следующей мыслью было бы выкатить мою собственную облегченную версию CompositeCollection, но я не могу не думать, что она использует 18-колесный автомобиль, чтобы купить молоко в магазине. Но, похоже, это самое обещание.

Есть ли другой способ заставить пользовательский IEnumerable правильно обрабатывать уведомления из внутренних коллекций? (Я также не против отказаться от этого model свойство в первую очередь и вместо этого сделать комбинацию на уровне пользовательского интерфейса. Буду ли я это делать, зависит от ответов, которые я получу здесь.)

0 ответов