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);
}
}
你是否在你的代碼中的其他地方訂閱? – Default
爲什麼你不能訂閱一次。而不是每次更改 – RadioSpace
另請注意,您只處理「添加」。當您在列表中執行Reset或Clear時,代碼將不會被調用。它應該取消訂閱,如果相同的元素再次傳遞給列表。您的描述有點模糊,關於「清除[..]似乎並沒有刪除[..]」 – Default