Я попробовал решить исходную задачу с помощью следующего кода (правда пришлось заменить самописные ObservableCollection и сопутствующие классы на те что включены в сборку WindowsBase от третьего фреймворка):
var coll = new ContinuousCollection<Page>();
var res =
coll.Select(p => new Rectangle(Point.Empty, p.Size))
.Concat(coll.Select(p => p.PageHeader.Rect))
.Concat(coll.SelectMany(p => p.Items).Select(block => block.Rect))
.Concat(coll.SelectMany(p => p.Items).SelectMany(b => b.Items).Select(t => t.Rect))
;
NotifyCollectionChangedEventHandler h = (sender, args) =>
{
if (args.OldItems != null)
foreach (var oldItem in args.OldItems)
{
invalidateHandler((Rectangle) oldItem);
}
if (args.NewItems != null)
foreach (var newItem in args.NewItems)
{
invalidateHandler((Rectangle) newItem);
}
};
res.CollectionChanged += h;
coll.Add(page);
return new DisposeDelegate(() => res.CollectionChanged -= h);
Стандартный набор тестов проходит. Несколько тестов падает, но это непринципиально (проблема момента начала наблюдения).
Интересно, совпадают ли мощности у CLinq и моего решения в плане отслеживания изменений, то есть все ли задачи доступные CLinq решаются механизмом подписки. Если это так, то можно сделать билдер на тех же LINQ расширениях. Другая задача - это генерация последовательности, аналогичной CLinq.
Комментариев нет:
Отправить комментарий