2011-06-24 74 views
0

我有一個在列表框上使用的附加行爲,它應該自動選擇列表中的第一個元素,如果列表只包含一個元素。行爲中的Lambda表達式委託

,我發現勾當列表的變化,是使用列表框」列表框中的唯一途徑itemcollections CollectionChanged事件:

private static void ListenToItemsCollectionChange(ListBox listBox) 
{ 
    var collection = (INotifyCollectionChanged)listBox.Items; 

    collection.CollectionChanged += (sender, args) => SelectAndSetFocusToFirstElement(listBox); 
} 

現在的問題是,從沒有退訂方式該事件可能導致多個調用SelectAndSetFocusToFirstelement()

正常的解決方案是,不使用lambdas。但是,我會放棄我的列表框,我需要選擇第一個元素。

有關如何解決這個問題的任何建議?

Full code

回答

0

我有一個有點困惑什麼是「但後來我將失去我的列表框」你勁歌?

也許這個解決方案將充分

你可以保留的事件處理程序中的臨時變量一樣,

EventHandler handler = (a, b) => { }; // You must use aproperiate delegate 
    collection.CollectionChanged += handler 

,如果你想退訂,您可以使用 - =處理器

+0

的事件處理程序爲CollectionChanged讓你沒有參考列表框 - 只集合。通過使用lambda,你仍然可以訪問局部變量,並且可以訪問作爲參數傳遞給'ListenToItemsCollectionChage()'方法的列表框。 – Vegar

+0

你將如何使用對來自其他地方的臨時變量中存儲的事件處理程序的引用? – Vegar

1

拉姆達只是代表的快捷方式,因此您可以將lambda重寫爲

NotifyCollectionChangedEventArgs collectionChangedDelegate = (sender, arg) => 
{SelectAndSetFocusToFirstElement(listBox)}; 

那麼你可以添加到集合更改事件

collection.CollectionChanged += collectionChangedDelegate 

,並刪除

collection.CollectionChanged -= collectionChangedDelegate 
+0

但是你在哪裏保留對'ListenToItemsCollectionChange'的調用之間對collectionChangedDelegate的引用? – Vegar

+0

當我使用類級字典來保存對各種委託的引用並向控件的Unloaded事件添加處理程序以刪除事件委託(以及它在字典中的關聯引用)之前, – MarcE

相關問題