在 WPF 中创建 ViewModel 时,有时需要将ObservableCollection
(源集合)中可用的数据转换为扩展/限制/投影原始元素(目标集合)的包装元素集合,而元素的数量和顺序始终反映原始收藏。
就像Select扩展方法一样,只是它不断更新,因此可以用于 WPF 绑定。
如果在索引 x 处将元素添加到源,则在目标集合中的相同索引 x 处添加相同元素的 Wrapper。如果在源集合中删除索引 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
似乎是别人已经做过的事情,甚至可能是核心框架的一部分。但我找不到它。