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