2014-04-03 74 views
0

我正在添加一個可觀察集合的更改事件。事件沒有得到解決

var someList = new Observablecollection<ITCardBase>(); 
someList.CollectionChanged+=Changed; 

void Changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
    { 
     if(e.NewItems[0] is ITCardBase) 
     { 
      ITCardBase eq = (ITCardBase)e.NewItems[0]; 
      eq.Unsubscribe(TCardClickedInList); 
      eq.Subscribe(TCardClickedInList); 
     } 
    } 

} 
//this just allows a user control to be clicked and bind to the event 
public virtual void Subscribe(Func<ITCardBase, int> myMethodName) 
{  
    TCardClick += myMethodName.Invoke;   
} 
public virtual void Unsubscribe(Func<ITCardBase, int> myMethodName) 
{    
    TCardClick -= myMethodName.Invoke; 
} 
public int TCardClickedInList(ITCardBase card) 
{ 
    //click event when the user clicks the "card" user control" 
    return 0; 
} 

我遇到的問題是,當清除我的列表,然後從我的數據庫重新添加項目,單擊事件被複制,因此它被調用兩次,然後樹的時候,等於是清除SomeList似乎並沒有刪除它們內部對象上的事件,即使它們應該消失。

如何正確「清除」列表中的項目,因此當它們再次從數據庫添加(它們是相同的項目)時,它不會重複此事件。我嘗試做一個Unsubscribe(),這不起作用。

編輯:

public void ReloadTCards() 
    { 
     if (SubTCardList != null) 
     { 

     foreach(ITCardBase card in SubTCardList) 
     { 
      card.Unsubscribe(TCardClickedInList); 
     }//I TRIED unsubscribg each element before I clear the list 
      //but then when I readd the items to the list, the same issue happens 

      SubTCardList.Clear(); 
      LoadSubTCardsWithIncidentID(TCardLoadedIncidentId); 
     } 

    } 
+0

你是否在你的代碼中的其他地方訂閱? – Default

+0

爲什麼你不能訂閱一次。而不是每次更改 – RadioSpace

+0

另請注意,您只處理「添加」。當您在列表中執行Reset或Clear時,代碼將不會被調用。它應該取消訂閱,如果相同的元素再次傳遞給列表。您的描述有點模糊,關於「清除[..]似乎並沒有刪除[..]」 – Default

回答

0
public virtual void Subscribe(Func<ITCardBase, int> myMethodName) 
    { 

     TCardClick = null;//THIS FIXED EVERYTHING 
     TCardClick += myMethodName.Invoke;   
    } 

我只是空的情況下,作爲第二次認購叫(當被加入列表,再次),這是不爲空,因爲它是第一次。