WPF RoutedEvent (через EventManager.RegisterClassHandler) - PullRequest
5 голосов
/ 25 ноября 2010

Я пытаюсь найти общий способ отслеживания «Изменен» любого элемента управления (привязка данных или нет) в текущем окне (например, для включения или отключения кнопки «Применить» в типичном окне «Параметры»). Фактически,Мне просто нужно подключить несколько обработчиков событий, таких как ComboBox.SelectionChanged или TextBox.TextChanged.В WinForms мне приходилось перебирать все элементы управления в форме и подключать эти события одно за другим, и это работало.В WPF я думал, что смогу сделать это с гораздо меньшим количеством кода, например

EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , ComboBox.SelectionChangedEvent
                                 , new RoutedEventHandler(OnChanged));

С этим однострочным кодом, я смогу подключить событие изменения выбора комобокса для всех комбинированных списков в MyCtrl.Однако проблема, с которой я столкнулся, заключается в том, что, если я правильно вижу, это событие также запускается, когда в окне есть другой элемент управления, который не является списком, но также получен из "Selector".Например, у меня также есть сетка данных в том же окне (на самом деле в сетке данных нет столбца со списком), это событие также вызывается, когда я выбираю другую строку.

Итак, похоже, что приведенная выше строкакода подключает событие SelectionChanged для всех элементов управления, полученных из Selector base, а не только из выпадающего списка.

Это правильно?Как я могу просто подключить событие SelectionChanged для всех комбинированных списков?

РЕДАКТИРОВАТЬ с большим количеством примеров: на одном элементе управления у меня есть поле со списком и кнопка, и я хочу отслеживать событие Button.Click и ComboBox.SelectionChanged какследует

EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , ComboBox.SelectionChangedEvent
                                 , new RoutedEventHandler(OnChanged));
EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , Button.ClickEvent
                                 , new RoutedEventHandler(OnChanged));

Проблема в том, что я получаю событие Button.Click сразу после того, как я нажал кнопку раскрывающегося списка ComboBox.Как я могу предотвратить это?

Вот дополнительная информация для этого события:

?e.OriginalSource
{System.Windows.Controls.Primitives.ToggleButton Content: 
            IsChecked:True}
    base {System.Windows.Controls.Primitives.ButtonBase}: 
            {System.Windows.Controls.Primitives.ToggleButton Content: IsChecked:True}
    IsChecked: true
    IsThreeState: false
?e.RoutedEvent
{ButtonBase.Click}
    HandlerType: {Name = "RoutedEventHandler" 
                  FullName = "System.Windows.RoutedEventHandler"}
    Name: "Click"
    OwnerType: {Name = "ButtonBase" 
                FullName = "System.Windows.Controls.Primitives.ButtonBase"}
    RoutingStrategy: Bubble

1 Ответ

2 голосов
/ 05 мая 2011

Я не думаю, что вы можете предотвратить это, потому что эти элементы управления повторно используют одни и те же события, что, как правило, хорошо. Вы можете попытаться выполнить фильтрацию по отправителю и игнорировать вызовы, поступающие от элементов управления, которые вас не интересуют.

...