2011-06-24 44 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

相关问题