При создании ViewModels в WPF иногда необходимо преобразовать данные, которые доступны в ObservableCollection
(исходная коллекция) в коллекцию которые расширяют/ограничивают/проектируют исходные элементы (целевую коллекцию), а количество и порядок элементов всегда отражают исходную коллекцию.
Так же, как Выбрать метод расширения, за исключением того, что он постоянно обновляется и поэтому может использоваться для привязок WPF.
Если элемент добавляется к источнику с индексом x, обертка того же элемента добавляется с тем же индексом x в целевой коллекции. Если элемент в индексе y удаляется в исходной коллекции, элемент в индексе y удаляется в целевой коллекции.
Скажем, что ObservableCollection<ClassA>
, но мне нужно привязать ReadOnlyObservableCollection<ClassB>
(или эквивалент), где ClassB
→ ClassA
выглядит следующим образом:
class ClassB : INotifyPropertyChanged, IDisposable
{
public ClassB(ClassA a)
{
Wrapped = a;
(Wrapped as INotifyPropertyChanged).PropertyChanged+=WrappedChanged;
}
public ClassA Wrapped { get; private set; }
public int SomeOtherProperty { get { return SomeFunction(Wrapped); }
WrappedChanged(object s, NotifyPropertyChangedArgs a) { ... }
...
}
Я могу написать свой собственный TemplatedTransformCollectionWrapper
, где я могу написать это:
ObservableCollection<ClassA> source;
TemplatedTransformCollectionWrapper theCollectionThatWillBeUsedInABinding
= TemplatedTransformCollectionWrapper(source, classA => new ClassB(classA));
TemplatedTransformCollectionWrapper идеально обертывает все коллекции, которые реализуют INotifyCollectionChanged
, и правильно обрабатывает все возможные операции добавления, удаления, замены исходной, завернутой, коллекции.
Неправильно писать TemplatedTransformCollectionWrapper
правильно и, похоже, это то, что уже сделал кто-то еще, возможно, это даже часть основной структуры. Но я не могу его найти.