需要帮助将C#翻译成VB吗
我正在看博客,我正试图把这个片段翻译成VB 我对这一行有困难:需要帮助将C#翻译成VB吗,c#,vb.net,c#-to-vb.net,C#,Vb.net,C# To Vb.net,我正在看博客,我正试图把这个片段翻译成VB 我对这一行有困难: NotifyCollectionChangedEventHandler handlers = this.CollectionChanged; 注意:CollectionChanged是此事件的一个事件(“这”是对ObservableCollection的覆盖)。从字面上看,它应该类似于 Dim handlers As NotifyCollectionChangedEventHandler = AddressOf Me.Collec
NotifyCollectionChangedEventHandler handlers = this.CollectionChanged;
注意:CollectionChanged是此事件的一个事件(“这”是对
ObservableCollection
的覆盖)。从字面上看,它应该类似于
Dim handlers As NotifyCollectionChangedEventHandler = AddressOf Me.CollectionChanged
(我不知道确切的类型,所以说不出来)
但请注意,在VB中使用
RaiseEvent
Duh引发事件。在最终看到并阅读了您链接的博客帖子后,以下是答案:
在VB中,您需要声明一个自定义事件来覆盖RaiseEvent
机制。在最简单的情况下,如下所示:
Private m_MyEvent As EventHandler
Public Custom Event MyEvent As EventHandler
AddHandler(ByVal value as EventHandler)
m_MyEvent = [Delegate].Combine(m_MyEvent, value)
End AddHandler
RemoveHandler(ByVal value as EventHandler)
m_MyEvent = [Delegate].Remove(m_MyEvent, value)
End RemoveHandler
RaiseEvent(sender as Object, e as EventArgs)
Dim handler = m_MyEvent
If handler IsNot Nothing Then
handler(sender, e)
End If
End RaiseEvent
End Event
在您的例子中,RaiseEvent
例程稍微复杂一些,以反映额外的逻辑,但要点保持不变。要引发事件,OnCollectionChanged
应该可以正常工作。如果你想查询它,你必须使用更多的辱骂和反射(对不起,例子是C#,但实际上应该是相同的-我这里没有使用任何特定于语言的功能):
只有当
CollectionChanged
是订阅者,而不是事件处理程序(可能是)时,这才有效。但在本例中,您的第二句话适用。它根本不起作用,我一年前就尝试过。AddressOf只需要一个方法名。@Shimmy:根据您的信息,这是一个有效的猜测AddressOf
就是在这种情况下工作的。你想要的内容没有其他直接翻译。好的,请查看该博客中的帖子。@Shimmy:我回滚了你的编辑;它实际上引入了一个讨厌的多线程错误。复制事件处理程序很重要!(和Shadows
在那里没有位置。)那么我怎么才能进入基本活动呢?@Shimmy:你不能。无论出于何种原因,任何类都不能直接访问其基类事件。NET只是不允许这样做。但是如果使用自定义,即使它也不会做任何事情,因为事件附加到INotifyCollectionChanged事件,忽略自定义event@Mark,你是赢家,大人物!
NotifyCollectionChangedEventHandler handler = (NotifyCollectionChangedEventHandler)
typeof(ObservableCollection<T>)
.GetField("CollectionChanged", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(this);
Protected Overrides Sub OnCollectionChanged(e As NotifyCollectionChangedEventArgs)
If e.Action = NotifyCollectionChangedAction.Add AndAlso e.NewItems.Count > 1 Then
Dim handler As NotifyCollectionChangedEventHandler = GetType(ObservableCollection(Of T)).GetField("CollectionChanged", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)
For Each invocation In handler.GetInvocationList
If TypeOf invocation.Target Is ICollectionView Then
DirectCast(invocation.Target, ICollectionView).Refresh()
Else
MyBase.OnCollectionChanged(e)
End If
Next
Else
MyBase.OnCollectionChanged(e)
End If
End Sub