2

ObservableCollection を ObservableCollection の派生型にコピーしようとしていますが、CollectionChanged イベントを保持したいと考えています。

これまでのところ、私は持っています:

public class PartitionCollection : ObservableCollection<AislePartition>
{
    public PartitionCollection(ObservableCollection<AislePartition> other)
    : base(other)
    {

    }

    // ...

    protected override void InsertItem(int index, AislePartition item)
    {
         // Important custom logic runs here
         if (/* */)
             base.InsertItem(index, item);
         else
             Merge(item);
    }

    protected void Merge(AislePartition item)
    {
         // ...
    }
}

コレクションは正常にコピーされますが、CollectionChanged イベントも取得する必要があります。

それを行う方法はありますか?ありがとう

編集:

前: コンストラクター呼び出しの前に 後: コンストラクター呼び出しの後

この特定のコンストラクターを使用するコード:

    private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        AisleSelection aisleSelect = args.NewValue as AisleSelection;
        if (aisleSelect.Partitions == null)
            aisleSelect.Partitions = new PartitionCollection();
        else
            aisleSelect.Partitions = new PartitionCollection(aisleSelect.Partitions);
    ...
    }

基本的に、私がやろうとしているのは、ObservableCollection を、いくつかの主要メンバーをオーバーライドする PartitionCollection に置き換えることです。ObservableCollection はサーバーからシリアル化された形式で渡されるため、直接使用する方法はありません。

4

2 に答える 2

3

私があなたの質問を正しく理解している場合は、監視可能なコレクションを別のコレクションに置き換えたいが、新しいコレクションが変更されたときに古いコレクションのイベントのサブスクライバーに通知する必要があります。

それが正しければ、古いコレクションを新しいコレクションと同期させておくことが必要です。新しいコレクションは、古い(ソース)コレクションへの参照を保持する必要があり、新しいコレクションが変更されるたびに、古いコレクションに対して同じ変更を実行します。

では、、、をPartitionCollectionオーバーライドClearItemsして、新しいコレクションのメソッドの基本クラス実装を呼び出した後、変更を古いコレクションに転送できます。これにより、同期が維持されます。InsertItemRemoveItemSetItem

コレクションの単一のコピーのみが絶対に必要な場合は、インターフェイスの独自の実装を派生PartitionCollectionさせて提供できます。IObservableCollection<AislePartition>このコレクションのバッキングストアは、古いコレクションである必要があります。このソリューションは、ラップされたコレクションの同じメソッドに単純にフォワーダーとなる多くのメソッドを実装する必要があるため、非常に面倒ですが、コレクションがコピーされていないことを確認します。

古いコレクションをラッパー以外の方法で変更できる場合は、古いコレクションの変更をサブスクライブして、ラッパーから同様のイベントを発生させる必要があります。

本当に必要な場合は、古いコレクションの呼び出しリストにアクセスできるようにする「邪悪な」トリックがいくつかあります。しかし、それをする前に私はよく考えます。

于 2012-08-10T16:03:19.087 に答える
1

イベントはハンドラーを追加してハンドラーを削除する2つのメソッドしか提供しないため、イベントハンドラーをあるオブジェクトから別のオブジェクトにコピーすることはできません...つまり、ハンドラーを列挙して新しいオブジェクトイベントに追加することはできません.

私がお勧めするのは、古いオブジェクトを弱い (または強い) ものにして、最初にイベントのすべてのサブスクライバーを呼び出してから、提供されたオブジェクトでイベントを呼び出す内部イベント ハンドラーを提供することです。

強い参照を使用すると、現在のオブジェクトが存続している限り古いオブジェクトが存続するため、メモリ リークや過度のメモリ使用が発生する可能性があることに注意してください。

于 2012-08-10T16:09:49.237 に答える