需要帮助将C#翻译成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

我正在看博客,我正试图把这个片段翻译成VB

我对这一行有困难:

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