Я пытаюсь найти общий способ отслеживания «Изменен» любого элемента управления (привязка данных или нет) в текущем окне (например, для включения или отключения кнопки «Применить» в типичном окне «Параметры»). Фактически,Мне просто нужно подключить несколько обработчиков событий, таких как 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