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