需要帮助将C#转换为VB

时间:2010-02-01 17:31:38

标签: c# vb.net c#-to-vb.net

我正在查看this博客,我正在尝试将代码段转换为VB。

我在这条线上遇到了困难:

NotifyCollectionChangedEventHandler handlers = this.CollectionChanged;

注意:CollectionChanged是这样的事件('this'是ObservableCollection<T>的覆盖)。

3 个答案:

答案 0 :(得分:3)

引发事件,OnCollectionChanged应该可以正常工作。如果你想查询它你必须得到更多的侮辱和使用反射(对不起,例子是C#,但应该几乎相同 - 我在这里没有使用任何语言特定的功能):

NotifyCollectionChangedEventHandler handler = (NotifyCollectionChangedEventHandler)
    typeof(ObservableCollection<T>)
    .GetField("CollectionChanged", BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(this);

et voila;处理程序或处理程序(通过GetInvocationList())。

所以基本上在你的例子中(关于那篇文章),使用:

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

答案 1 :(得分:2)

从字面上看,它应该像

Dim handlers As NotifyCollectionChangedEventHandler = AddressOf Me.CollectionChanged

(因为我不知道确切的类型,所以无法分辨)

但请注意,您使用RaiseEvent

在VB中引发事件

答案 2 :(得分:2)

咄。在最终看到并阅读您链接的博客帖子之后,这里是答案:

在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例程稍微涉及到反映额外逻辑,但要点仍然相同。