我正在查看this博客,我正在尝试将代码段转换为VB。
我在这条线上遇到了困难:
NotifyCollectionChangedEventHandler handlers = this.CollectionChanged;
注意:CollectionChanged是这样的事件('this'是ObservableCollection<T>
的覆盖)。
答案 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
答案 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
例程稍微涉及到反映额外逻辑,但要点仍然相同。