Я не верю, что VB.NET каким-либо образом объединяет подобные события, поэтому вам, возможно, придется настроить его для использования многоадресных делегатов.Я не буду тестировать этот код, но мы можем отлаживать его по ходу работы.
Сначала в ComboTreeNodeCollection измените событие CollectionChanged на Public CollectionChanged As NotifyCollectionChangedEventHandler
.
Для всех value.Nodes.CollectionChanged += CollectionChanged
измените его на value.Nodes.CollectionChanged = [Delegate].Combine(value.Nodes.CollectionChanged, CollectionChanged)
.
Для - =, используйте value.Nodes.CollectionChanged = [Delegate].Remove(value.Nodes.CollectionChanged, CollectionChanged)
.
Наконец (надеюсь), для Protected Overridable Sub OnCollectionChanged
измените CollectionChanged(Me, e)
(или как он выглядит) на CollectionChanged.Invoke(Me, e)
.
Да, и вы можете захотеть добавить методы для замены AddHandler и RemoveHandler. На самом деле, у меня просто была идея, где вы можете создать пользовательское событие, которое объединяет и удаляет из делегата;вам все равно потребуется реализовать приведенный выше код, но, когда вы или другие пользователи захотят использовать это событие, они смогут добавлять и удалять как обычно.
Это, очевидно, не является предпочтительным, но,если есть какой-то способ, который я не помню, чтобы получить делегатов мероприятия, это было бы предпочтительным.Другой идеей было бы добавить проект C # в ваш проект VB.NET, содержащий код C #, или создать код C # для использования в приложении VB.NET.
Чтобы ответить на ваш вопрос о value.Nodes.CollectionChanged += CollectionChanged;
, этообъединение делегатов CollectionChanged родительского узла с текущим узлом.По сути, каждое изменение всего дерева будет вызывать обработчики событий каждого дочернего элемента, поднимаясь вверх по дереву.Подобное объединение делегатов создает многоадресный делегат, а в C # объединение многоадресных делегатов через события так же просто, как + =.Однако в VB.NET кажется, что AddHandler не преобразует события в делегаты.