나는 this 블로그를보고 VB로 스 니펫을 번역하려고합니다.C#을 VB로 번역하는 데 도움이 필요합니다.
나는이 라인에 어려움을 겪고있어 :
NotifyCollectionChangedEventHandler handlers = this.CollectionChanged;
참고 : CollectionChanged이의 이벤트를 ('이'ObservableCollection<T>
의 재정의입니다)입니다.
나는 this 블로그를보고 VB로 스 니펫을 번역하려고합니다.C#을 VB로 번역하는 데 도움이 필요합니다.
나는이 라인에 어려움을 겪고있어 :
NotifyCollectionChangedEventHandler handlers = this.CollectionChanged;
참고 : CollectionChanged이의 이벤트를 ('이'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
말 그대로,이 같은해야
Dim handlers As NotifyCollectionChangedEventHandler = AddressOf Me.CollectionChanged
을하지만 사용 VB에서 이벤트를 발생주의 (I 정확한 종류를 알 수 없기 때문에 말할 수 없다) RaiseEvent
'CollectionChanged'는 가입자가 아니라 (이것은 아마도) 이벤트 핸들러하지만,이 경우에는 인 경우에만 작동하여 두 번째 문장이 적용됩니다. –
전혀 작동하지 않습니다. 1 년 전에 이것을 시도했습니다. AddressOf는 메소드 이름 외에는 아무것도 기대하지 않습니다. – Shimmy
@ Shimmy : 귀하의 정보가 주어지면 그것은 유효한 추측이었습니다. 'AddressOf'는이 정확한 문맥에서 작동합니다. 당신이 원하는 것을 직접 번역 할 수는 없습니다. –
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
루틴이 추가 논리를 반영하기 위해 약간 더 복잡하지만, 요점은 동일하게 유지됩니다.
@Shimmy : 편집을 롤백했습니다. 사실은 불쾌한 멀티 쓰레딩 버그를 일으켰습니다. 이벤트 처리기 ** 복사 ** 중요! (그리고'Shadows'는 그 안에 아무런 자리도 없었습니다.) –
어떻게하면 기본 이벤트에 참여할 수 있습니까? – Shimmy
@Shimmy : 할 수 없습니다. 어떤 이유로 든 어떤 클래스도 기본 클래스 이벤트에 직접 액세스 할 수 없습니다. . NET은 그냥 허용하지 않습니다. –
@ Mark를 무시하므로 사용자는 큰 시간을가집니다! – Shimmy