2012-08-10 87 views
2

我想將ObservableCollection複製到ObservableCollection派生類型中,並且我想保留CollectionChanged事件。如何克隆ObservableCollection <T> .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事件了。

這樣做的任何方式? 感謝

編輯:

前: Before the constructor call 後: After the constructor call

使用這種特殊的構造函數的代碼:

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以序列化的形式從服務器傳遞給我,因此我無法直接使用它。

+0

你所說的「克隆事件」呢? – ken2k 2012-08-10 15:57:12

+0

我的意思是我需要將所有處理程序複製到一個新事件中,並丟棄舊事件。在C++中this.CollectionChangedEvent = std :: move(other.CollectionChangedEvent)。但是,這不是C++ :( – 2012-08-10 16:24:05

回答

3

如果我正確理解你的問題要與其他上觀察到的集合來代替,但你仍然希望用戶對舊收集事件的新的集合更改時通知。

如果這是正確的,你想要的是保留舊收集與新的集合同步。新集合應該保留對舊集合的引用,並且只要新集合被修改,就對舊集合執行相同的修改。

PartitionCollection可以覆蓋ClearItemsInsertItemRemoveItemSetItem並調用基類實現的新集合中的方法後轉發更改到收舊。這應該保持同步。

如果您絕對只需要一個sinlge集合的副本,您可以從IObservableCollection<AislePartition>派生PartitionCollection併爲您提供自己的接口實現。此集合的後備存儲應該是舊集合。這個解決方案非常繁瑣,因爲你必須實現許多方法,這些方法僅僅是轉發器對包裝集合上的相同方法,但是你會確保集合不被複制。

如果舊的收集可以通過其他方式不是通過您的包裝進行修改,你將有訂閱的收舊的變化與火從包裝類似事件。

有一些"evil" tricks,可能讓你得到進入收舊的調用列表,如果你真的想。但是,在做這件事之前我會考慮三次。

+0

沒有,他提供了另一種對象,他希望將事件處理程序從其他對象複製到新的一個在構造函數中 – 2012-08-10 16:05:10

+0

@JorgeCórdoba:但是,這是明智的。如果我添加事件處理程序?對A和後來的事件被觸發,但是從B中的事件,是不是覺得意外,我沒有對處理程序添加到B - 只答: – 2012-08-10 16:10:47

+0

是啊,你說得對,但是這是問題的情況下什麼是「明智的」或者不是真的取決於很多因素,其中更好的部分與里程碑,交付壓力和管理壓力有關:)我不是說這是一個好的做法,我說的是我的方式將會解決它,但正如你所說那樣做很奇怪。 – 2012-08-10 16:15:33

1

你不能只從一個對象複製事件處理程序到另一個對象,因爲事件提供了兩個方法來添加一個處理和刪除處理程序...換句話說,你不能枚舉的處理程序,並將它們添加到你的新對象事件。

我會建議對舊對象做一個弱(或強),並提供一個內部事件處理程序,首先調用事件的所有訂閱者,然後調用提供的對象上的事件。

請記住,如果你使用的強引用舊的對象將保持活着,只要當前對象是活的,這樣可能會導致內存泄漏或過度的內存使用情況。

+0

聽起來很有趣,但原來的目的是要被銷燬(我用新的替換它)。最壞的情況我只是這樣做,因爲我可以保證在整個程序中只有一個特定對象的實例。 – 2012-08-10 16:16:43

相關問題