gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:41:54 24 4
gpt4 key购买 nike

我用过 developerfusion C# to VB conversion tool转换 Brad Smith's ComboTreeBox项目,我在事件处理程序上遇到了麻烦,这对我和 C# 到 VB 的转换来说是很正常的。

IList(Of ComboTreeNode).Item 的接口(interface)实现中有这样的 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 的第二个参数需要是一个方法地址。

我在这里被难住了。我错过了什么?

最佳答案

我不相信 VB.NET 有任何方法来组合这样的事件,因此您可能必须调整它以使用多播委托(delegate)。我不会测试这段代码,但我们可以边调试边调试它。

首先,在 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。 实际上,我只是想到了一个想法,您可以在其中创建一个自定义事件,该事件可以组合委托(delegate)并从委托(delegate)中删除;您仍然需要实现上述代码,但是,当您或其他用户想要使用该事件时,他们将能够正常添加和删除。

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

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

关于c# - 将 CollectionChanged 事件处理程序行从 C# 转换为 VB.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7914341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com