Лямбда-выражение делегатов в поведении - PullRequest
0 голосов
/ 24 июня 2011

У меня есть прикрепленное поведение, которое используется в списке, он должен автоматически выбирать первый элемент в списке, если список содержит только один элемент.

Единственный найденный мной способ - перехватить список.когда список изменяется, это использовать событие collectionChanged элемента listbox:

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

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

Проблема сейчас в том, что нет способа отписаться от события, что потенциально приводит к множественным вызовам SelectAndSetFocusToFirstelement( ).

Обычное решение этой проблемы - не использовать лямбды.Но тогда я потерял бы свой список, который мне нужен для выбора первого элемента.

Любые предложения о том, как это можно решить?

Полный код

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Лямбда - это просто ярлык для делегата, поэтому вы можете переписать лямбду как

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

тогда вы можете добавить в коллекцию измененное событие

collection.CollectionChanged += collectionChangedDelegate

и удалите

collection.CollectionChanged -= collectionChangedDelegate
0 голосов
/ 24 июня 2011

Я немного запутался, что Ты имеешь в виду под "Но тогда я потеряю свой список"?

Может быть, этого решения будет достаточно

Вы можете хранить обработчик событий во временной переменной, как эта

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

и если вы хотите отписаться, вы можете использовать - = обработчик

...