Когда я впервые начал писать пользовательские элементы управления WPF, если я хотел добавить обработчик событий, я делал это в переопределении элемента управления OnApplyTemplate после получения части шаблона:
public void override OnApplyTemplate() {
if ( addMenu != null ) {
addMenu.Click -= addMenu_Click;
addMenu = null;
}
addMenu = (MenuItem)Template.FindName("PART_AddMenu", this);
addMenu.Click += addMenu_Click;
}
Но затем однажды я заметил, что OnApplyTemplate () не всегда вызывается, когда я ожидаю, что это произойдет, то есть когда элемент управления отключен от визуального дерева. То есть, используя описанную выше технику, обработчики событий не всегда будут удалены. Поэтому я придумал другой способ:
public MyCustomControl()
{
Loaded += this_Loaded;
}
void this_Loaded(object sender, RoutedEventArgs e)
{
Unloaded += this_Unloaded;
addMenu = (MenuItem)Template.FindName("PART_AddMenu", this);
addMenu.Click += addMenu_Click;
}
void this_Unloaded(object sender, RoutedEventArgs e)
{
Unloaded -= this_Unloaded;
if (addMenu != null)
{
addMenu.Click -= addMenu_Click;
addMenu = null;
}
}
Этот способ, кажется, делает свое дело. Все согласны с тем, что это лучший способ подключения и удаления обработчиков событий в пользовательском элементе управления? Если нет, то почему?