Как пользовательский итератор может уведомлять подписчиков об изменениях своих итерированных элементов (например, «INotifyCollectionChanged»)? - PullRequest
0 голосов
/ 15 декабря 2018

Мы пытаемся представить содержимое двух дочерних коллекций как дополнительное всеобъемлющее свойство 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 в первую очередь и вместо этого выполнить комбинацию на уровне пользовательского интерфейса. Буду ли я это делать, зависит от ответов, которые я получаю здесь.)

...