Реализация одного обработчика событий для нескольких элементов управления с различными делегатами обработчика событий - PullRequest
6 голосов
/ 19 ноября 2011

У меня есть функция, void Validate(), которая содержит всю мою логику проверки для окна.

Я не могу просто зарегистрировать это как обработчик событий, потому что он не принимает параметры, требуемые дляделегаты обработчиков событий.Кроме того, разные типы элементов управления имеют разные подписи, поэтому я не могу просто Validate сопоставить одну подпись, игнорируя их содержимое.

Вот небольшой пример того, что я настроил

    txt1.TextChanged += Validate_TextChange;
    password1.PasswordChanged += Validate_RoutedEvent;
    txt2.TextChanged += Validate_TextChange;

    txt3.TextChanged += Validate_TextChange;
    password2.PasswordChanged += Validate_RoutedEvent;
    txt4.TextChanged += Validate_TextChange;


void Validate_RoutedEvent(object sender, RoutedEventArgs e)
{
    ValidateOptions();
}

void Validate_TextChange(object sender, TextChangedEventArgs e)
{
    ValidateOptions();
}

public void ValidateOptions()
{
   //Actual validation here
}

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


РЕДАКТИРОВАТЬ: Мне нравится вариант, предложенный Джоном для добавленияпараметры и просто игнорировать их.Это решает большую часть проблемы, но в любое время, когда я хочу вызвать эту функцию напрямую, например, чтобы вручную запустить проверку, я должен затем включить фиктивные аргументы для удовлетворения компилятора.ValidateOptions (this, new EventArgs ())

Предложение, которое сделал Дэн, для использования анонимных функций, справится с этим, но не так чисто при ассоциировании обработчиков событий.

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


РЕДАКТИРОВАТЬ:

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

txt1.TextChanged += ValidationEvent;
password1.PasswordChanged += ValidationEvent;
txt2.TextChanged += ValidationEvent;

txt3.TextChanged += ValidationEvent;
password2.PasswordChanged += ValidationEvent;
txt4.TextChanged += ValidationEvent;


//Single event handler accepting EventArgs, which is the base class
//for all more-specific event classes
void ValidationEvent(object sender, EventArgs e)
{
    //Ignores arguments and calls 0 argument ValidateOptions
    ValidateOptions();
}

//0 argument function that performs actual validation and can be called
//directly from other functions without the need to pass in a fake sender
//and eventargs parameter
public void ValidateOptions()
{
   //Actual validation here
}

Ответы [ 3 ]

7 голосов
/ 19 ноября 2011

Вы можете иметь единственный метод, который игнорирует параметры:

public void ValidateOptions(object sender, EventArgs e)
{
}

Компилятор разрешит преобразование из группы методов ValidateOptions в любой тип делегата, следующий за шаблоном нормального события, так что первый параметр - sender, а второй параметр - некоторый тип, полученный из EventArgs.

5 голосов
/ 19 ноября 2011

Вы можете использовать лямбда-выражения, чтобы уменьшить объем кода, который вы пишете для оболочек, хотя за кулисами все еще создаются методы-оболочки для отбрасывания параметров.

txt3.TextChanged += (s,e) => ValidateOptions();
password2.PasswordChanged += (s,e) => ValidateOptions();
txt4.TextChanged += (s,e) => ValidateOptions();
0 голосов
/ 19 ноября 2011

Этот обработчик обеспечивает один обратный вызов для элементов управления каркаса, а аргумент 'e' сохраняется для потребления ...

    private static void EventHandlerSink(object sender, dynamic e) 
    {

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