在VB中覆盖事件

时间:2010-02-15 21:38:44

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

有没有办法在VB中翻译这段代码?大部分都很简单,但我无法想出一种覆盖事件处理程序的方法。

public class MTObservableCollection<T> : ObservableCollection<T>
{

    public MTObservableCollection()
    {
        _DispatcherPriority = DispatcherPriority.DataBind;
    }
    public MTObservableCollection(DispatcherPriority dispatcherPriority)
    {
        _DispatcherPriority = dispatcherPriority;
    }
    private DispatcherPriority _DispatcherPriority;

    public override event NotifyCollectionChangedEventHandler CollectionChanged;
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        var eh = CollectionChanged;
        if (eh != null)
        {
            Dispatcher dispatcher = (from NotifyCollectionChangedEventHandler nh in eh.GetInvocationList()
                                     let dpo = nh.Target as DispatcherObject
                                     where dpo != null
                                     select dpo.Dispatcher).FirstOrDefault();

            if (dispatcher != null && dispatcher.CheckAccess() == false)
            {
                dispatcher.Invoke(DispatcherPriority.DataBind, (Action)(() => OnCollectionChanged(e)));
            }
            else
            {
                foreach (NotifyCollectionChangedEventHandler nh in eh.GetInvocationList())
                    nh.Invoke(this, e);
            }
        }
    }

}

2 个答案:

答案 0 :(得分:2)

重写编辑:

一个对话,认为它是一个编译器实现snafu并建议解决方法:

http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/ce30ceed-c260-4d99-b96d-5b7179466be8

这是我的(半)最终答案。

答案 1 :(得分:1)

在C#中覆盖事件甚至是错误的。 C# Programming Guide说:

  

不要在a中声明虚拟事件   基类并在a中覆盖它们   派生类。 C#编译器可以   没有正确处理这些   Microsoft Visual Studio 2008就是这样   无法预测订户是否   派生事件实际上是   订阅基类事件。

我想知道为什么框架类会违反此规则,甚至编译器允许它的原因。