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

У меня есть функция, 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
}
6
задан Eric 21 November 2011 в 21:08
поделиться