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