У меня есть функция, 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
}