2010-02-01 6 views
2

나는 this 블로그를보고 VB로 스 니펫을 번역하려고합니다.C#을 VB로 번역하는 데 도움이 필요합니다.

나는이 라인에 어려움을 겪고있어 :

NotifyCollectionChangedEventHandler handlers = this.CollectionChanged; 

참고 : CollectionChanged이의 이벤트를 ('이'ObservableCollection<T>의 재정의입니다)입니다.

답변

3

까지 이벤트를 발생 시키면 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 
+0

@ Mark를 무시하므로 사용자는 큰 시간을가집니다! – Shimmy

2

말 그대로,이 같은해야

Dim handlers As NotifyCollectionChangedEventHandler = AddressOf Me.CollectionChanged 

을하지만 사용 VB에서 이벤트를 발생주의 (I 정확한 종류를 알 수 없기 때문에 말할 수 없다) RaiseEvent

+0

'CollectionChanged'는 가입자가 아니라 (이것은 아마도) 이벤트 핸들러하지만,이 경우에는 인 경우에만 작동하여 두 번째 문장이 적용됩니다. –

+0

전혀 작동하지 않습니다. 1 년 전에 이것을 시도했습니다. AddressOf는 메소드 이름 외에는 아무것도 기대하지 않습니다. – Shimmy

+0

@ Shimmy : 귀하의 정보가 주어지면 그것은 유효한 추측이었습니다. 'AddressOf'는이 정확한 문맥에서 작동합니다. 당신이 원하는 것을 직접 번역 할 수는 없습니다. –

2

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 루틴이 추가 논리를 반영하기 위해 약간 더 복잡하지만, 요점은 동일하게 유지됩니다.

+0

@Shimmy : 편집을 롤백했습니다. 사실은 불쾌한 멀티 쓰레딩 버그를 일으켰습니다. 이벤트 처리기 ** 복사 ** 중요! (그리고'Shadows'는 그 안에 아무런 자리도 없었습니다.) –

+0

어떻게하면 기본 이벤트에 참여할 수 있습니까? – Shimmy

+0

@Shimmy : 할 수 없습니다. 어떤 이유로 든 어떤 클래스도 기본 클래스 이벤트에 직접 액세스 할 수 없습니다. . NET은 그냥 허용하지 않습니다. –

관련 문제