WPF で ViewModel を作成する場合、ObservableCollection
(ソース コレクション) で使用可能なデータを、元の要素 (ターゲット コレクション) を拡張/制限/投影するラッパー要素のコレクションに変換する必要がある場合があります。常に元のコレクションをミラーリングします。
Select拡張メソッドと同じですが、継続的に更新されるため、WPF バインディングに使用できる点が異なります。
ソースのインデックス x に要素が追加されると、同じ要素の Wrapper がターゲット コレクションの同じインデックス 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
、他の誰かがすでに行っているようなことのようです。おそらく、コアフレームワークの一部でさえあります. しかし、私はそれを見つけることができません。