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

我在这条线上遇到困难:

NotifyCollectionChangedEventHandler handlers = this.CollectionChanged;


注意:CollectionChanged是此事件(“ this”是ObservableCollection<T>的替代)。

最佳答案

要引发事件,OnCollectionChanged应该可以正常工作。如果要查询它,则必须更加滥用并使用反射(对不起,示例是C#,但实际上应该是相同的-我在这里不使用任何特定于语言的功能):

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


等处理程序(通过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

关于c# - 需要帮助将C#转换为VB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2178703/

10-09 01:10