лучший способ обработки события во вложенных пользовательских элементах управления - PullRequest
1 голос
/ 20 июля 2010

Я новичок в разработке GUI, в частности с WPF, и не знаю связанных шаблонов. Поэтому я хочу спросить вас о проблеме, которая возникает время от времени, и я не уверен в том, какое решение лучше для нее.

Пусть у нас есть три пользовательских элемента управления A, B, C и элемент управления A включает элемент управления B, элемент управления B включает элемент управления C. Пусть элемент управления C имеет кнопку. Событие click для этого должно решаться с использованием данных из класса A. Я вижу следующий возможный способ разобраться в этой ситуации:

1) Добавьте метод InnerButtonClick (отправитель объекта, RoutedEventArgs e) к классу A, который будет бороться с пузырьковым событием, вызванным нашей кнопкой. Недостатки:

i) этот метод будет перехватывать все события button.click от детей A. Поэтому мне потребуется реализовать некоторую условную логику в методе, чтобы проверить, вызвано ли событие нашей кнопкой.

ii) Получить там свойства С не так просто. Это может выглядеть как

        var btn = (Button)e.OriginalSource;
        string userName = ((ActionButtons)((UserControl)((StackPanel)btn.Parent).Parent)).UserName;

, если кнопка находится в StackPanel и StackPanel в пользовательском элементе управления C.

2) Предоставить доступ к необходимым данным для класса C. Например, передать данные в класс B, а затем в C. Недостатки:

i) часто это не так просто.

ii) вызывает дополнительные параметры методов / конструкторов.

3) Создать статический метод в классе A, который может вызываться методами класса C. Недостатки:

i) Это выглядит немного неприятно. Это путь к синглтону, шаблон из «темной стороны силы»)

1 Ответ

1 голос
/ 20 июля 2010

RoutedCommands именно для этого типа сценария. Установите команду на кнопке в C и добавьте CommandBinding для A, A не нужно знать о C, и C не нужно ничего знать о A таким образом. При нажатии кнопки в C команда всплывет до первой найденной привязки команды, которая в вашем случае будет A.

редактировать:
Вы можете использовать свойство CommandParameter для передачи текста из TextBox. Если вам нужно передать больше информации, чем просто 1 поле, вы можете обработать событие нажатия кнопки в C, собрать необходимые данные в одном объекте и затем запустить команду из кода с этим объектом в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...