Обработка событий с анонимным делегатом
Для записи: я нашел похожий вопросВот но я должен подробнее остановиться на этом вопросе.
Мой конкретный сценарий таков:
В Silverlight 4, ThemyFrameworkElement.FindName("otherElementName")
Кажется, что метод работает нормально, но я столкнулся с проблемой. Все еще возвращаетсяnull
когда элемент еще не добавлен в визуальное дерево, очевидно.
Но теперь мне нужен этот функционал вDependencyProperty
PropertyChangedCallback
обычаяUserControl
обработчик. В этой области пока неизвестно, добавлен ли UserControl в визуальное дерево. Но я должен выполнить определенное действие над другим элементом дерева. Когда элемент уже доступен, это можно и нужно сделать прямо сейчас. Если нет, то это должно быть сделано немедленно, когда это доступно. Итак, я придумал этот метод расширения, который я могу назвать так:
myFrameworkElement.FindNameEnsured("otherElementName",
result => this.DoSomethingWith(result));
Код для метода расширения выглядит следующим образом:
static public void FindNameEnsured(this FrameworkElement self,
string name, Action resultAction)
{
if (self != null && resultAction != null)
{
object result = self.FindName(name);
if (result != null)
{
resultAction(result);
}
else
{
RoutedEventHandler handler = null;
handler = (sender, e) =>
{
result = self.FindName(name);
resultAction(result);
self.Loaded -= handler;
};
self.Loaded += handler;
}
}
Как видите, я должен использовать анонимного делегата, потому что мне нужны значения дляname
а такжеresultAction
внутри обработчика. Затем я иду отписаться о событии внутри обработчика, потому что яя умный и чистый парень и не хочу никаких утечек. Я тоже неЯ не хочу разбивать мух на колесах с помощью каких-нибудь причудливых WeakEventFactories или подобных вещей.
Пока это работает без сбоев. Но у меня есть несколько вопросов.
Это вообще достаточно чистый подход, чтобы отписаться от обработчика событий внутри обработчика? Или это в конечном итоге убьет невинного щенка?Могут ли быть некоторые проблемы, такие как утечка из-за использования внешних переменных области действия внутри анонимного делегата?Могут ли быть проблемы с синхронизацией потоков, которые заставили бы меня "Мисс"Loaded
событие? В этом особом сценарии только Silverlights Поток диспетчера пользовательского интерфейса должен быть вовлечен. Но если этоВ любом случае это проблема, и / или если мне нужны аналогичные функции в сценарии, не связанном с пользовательским интерфейсом, что?s лучший подход к f1x0r это?Спасибо уже за ваше терпение и время, прочитав мои длинные разработки. ;-)