将CollectionChanged事件处理程序行从c#转换为VB.net

本文关键字:转换 VB net CollectionChanged 事件处理 程序 | 更新日期: 2023-09-27 18:12:28

我使用了developerfusion c#到VB的转换工具来转换Brad Smith的ComboTreeBox项目,我遇到了麻烦,这对我和c#到VB的转换是相当正常的,一个事件处理程序。

IList(Of ComboTreeNode).Item的接口实现中有以下c#代码:

#region IList<ComboTreeNode> Members
public ComboTreeNode this[int index] {
    get {
        return innerList[index];
    }
    set {
        ComboTreeNode oldItem = innerList[index];
        innerList[index] = value;
        value.Parent = node;
        value.Nodes.CollectionChanged += CollectionChanged;
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, oldItem));
    }
}

转换成

Public Default Property Item(index As Integer) As ComboTreeNode Implements IList(Of ComboTreeNode).Item, IList.Item
    Get
        Return innerList(index)
    End Get
    Set
        Dim oldItem As ComboTreeNode = innerList(index)
        innerList(index) = value
        value.Parent = node
        value.Nodes.CollectionChanged += CollectionChanged
        OnCollectionChanged(New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, oldItem))
    End Set
End Property

我在Set方法的最后两行出现了错误,坦率地说,我甚至不明白在那里做了什么。从我有限的c#事件知识来看,似乎要在事件本身上添加一个事件处理程序,这让我完全迷路了。

AddHandler value.Nodes.CollectionChanged, AddressOf CollectionChanged进行简单的转换只会提醒AddHandler的第二个参数需要是方法地址。

我被难住了。我错过了什么?

将CollectionChanged事件处理程序行从c#转换为VB.net

我不相信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。实际上,我只是有一个想法,你可以创建一个自定义事件,从委托组合和删除;您仍然需要实现上面的代码,但是,当您或其他用户想要使用该事件时,他们将能够像往常一样添加和删除。

这显然不是首选,但是,如果有某种方式我不记得获得事件的委托,那将是首选。另一个想法是在你的VB中添加一个c#项目。. NET项目包含c#代码或构建c#代码在您的VB中使用。网络应用程序。

要回答您关于value.Nodes.CollectionChanged += CollectionChanged;的问题,它将父节点的CollectionChanged委托与当前节点相结合。实际上,对整个树的每一次更改都会引发每个子节点的事件处理程序,并沿着树向上移动。像这样组合委托创建了一个多播委托,在c#中,通过事件组合多播委托就像+=一样简单。然而,在VB中。. NET中,AddHandler似乎不会将事件转换为委托。

最后两行似乎导致新的子节点订阅容器的CollectionChanged事件,然后触发该事件(因为向集合写入了新的子节点)。

您在这里缺少的是回调的定义,它将沿着以下行委托回事件:

Public Sub OnCollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
   RaiseEvent CollectionChanged(Me, e)
End Sub

同时,确保添加事件对象:

Public Event CollectionChanged As NotifyCollectionChangedEventHandler

最后几行可以是

 AddHandler value.Nodes.CollectionChanged, AddressOf OnCollectionChanged
 OnCollectionChanged(Me, New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add))