Как привязать событие к элементу управления, который динамически входит в состав DataTemplate?

У меня есть ListBox, который использует DataTemplateSelector, чтобы динамически решать, какой шаблон использовать, в зависимости от типа элемента в списке. Теперь я хочу перехватить события, которые могут запускаться элементами управления в DataTemplate. Например, если в одном из шаблонов есть флажок, я хочу, чтобы приложение, использующее элемент управления, получало уведомление, когда этот флажок установлен. Если в другом шаблоне есть кнопка, я хочу получать уведомление при нажатии кнопки.

Кроме того, поскольку это ListBox, многие элементы могут иметь один и тот же шаблон. Поэтому мне понадобится какой-то RoutedEventArgs, чтобы я мог выйти из OriginalSource и получить некоторую контекстную информацию для обработки события.

Мое решение заключалось в использовании MouseLeftButtonUp. Это отлично работает для TextBlocks, но похоже, что для элементов управления CheckBox и Button установлено значение true, поэтому событие не всплывает. Как я могу обработать эти события, чтобы назначить им обработчики в моем вызывающем приложении?

(Кроме того, Silverlight на самом деле не поддерживает DataTemplateSelector, поэтому я последовал этому примеру реализовать это)


person theraju    schedule 23.08.2010    source источник


Ответы (1)


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

Однако в конкретном сценарии, который вы описываете, вы также можете прослушивать событие MouseLeftButtonUp с помощью метода AddHandler: -

 myListBox.AddHandler(UIElement.MouseLeftButtonUpEvent, myListBox_MouseLeftButtonUp, true);

...

private void myListBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    //e.OriginalSource available for your inspection
}

Обратите внимание: используя AddHandler и передавая true в третьем параметре, вы получите событие независимо от того, было ли оно обработано.

person AnthonyWJones    schedule 23.08.2010
comment
Это работает, спасибо! Я хотел бы углубиться в другой вариант: указание обработчика событий в XAML. Моя проблема здесь в том, что XAML является частью библиотеки классов, на которую ссылается приложение, поскольку я создал для него пользовательский элемент управления. Как я могу добавить обработчик событий в XAML, если обработчик будет в проекте, который будет ссылаться на этот проект? - person theraju; 23.08.2010