Вы теряете обновления, если применяете конвертер, который не возвращает наблюдаемую коллекцию [sic] . То, чего вы пытаетесь достичь, на самом деле немного болезненно, в основном вам нужно сгладить иерархию при сохранении обновлений, это можно сделать с помощью CompositeCollection
в некоторой степени. например,
public class AConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var compositeCollection = new CompositeCollection();
var a = (A)value;
// React to changes of the Bs:
a.Bs.CollectionChanged += (s, e) =>
{
switch (e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
// ObservableCollection only ever manipulates one item, thus NewItems[0].
compositeCollection.Insert(e.NewStartingIndex, new CollectionContainer { Collection = ((B)e.NewItems[0]).Cs });
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
//TODO: Implement
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
//TODO: Implement
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
//TODO: Implement
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
//TODO: Implement
break;
default:
break;
}
};
// Add the items for the current Bs:
foreach (var item in a.Bs)
{
compositeCollection.Add(new CollectionContainer { Collection = item.Cs });
}
return compositeCollection;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
Реализация других случаев зависит от вас, вставки, кажется, работают.
Лучшим решением может быть предоставление CompositeCollections
на каждом уровне, потому что тогда они могут быть легко вложены, то есть вы можете добавить CollectionContainer
с CompositeCollection
в качестве источника.