0

我有一个在列表框上使用的附加行为,如果列表只包含一个元素,它应该自动选择列表中的第一个元素。

我发现在列表更改时挂钩列表框的唯一方法是使用列表框的 itemcollections CollectionChanged 事件:

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

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

现在的问题是,无法取消订阅该事件,这可能会导致多次调用SelectAndSetFocusToFirstelement( ).

对此的正常解决方案是不使用 lambdas。但后来我会松开我的列表框,我需要它来选择第一个元素。

关于如何解决这个问题的任何建议?

完整代码

4

2 回答 2

2

Lambda 只是委托的快捷方式,因此您可以将 lambda 重写为

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

然后您可以添加到集合更改事件

collection.CollectionChanged += collectionChangedDelegate

并删除

collection.CollectionChanged -= collectionChangedDelegate
于 2011-06-24T12:49:28.933 回答
0

我有点困惑“但是我会松开我的列表框”是什么意思?

也许这个解决方案就足够了

您可以像这样将事件处理程序保存在临时变量中

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

如果你想取消订阅你可以使用 -= handler

于 2011-06-24T12:46:11.350 回答