C# 这里有循环重复的事件处理吗?但是什么和如何呢?

C# 这里有循环重复的事件处理吗?但是什么和如何呢?,c#,wpf,C#,Wpf,如何在VS2017中避免此警告消息(或:可能发生的情况): “ObsCol.ObsCol()”包含导致调用虚拟方法的调用链 由类定义。 查看以下调用堆栈以了解意外后果: ObsCol..ctor() ObservableCollection.add\u CollectionChanged(NotifyCollectionChangedEventHandler):无效 代码如下: [Serializable] public class ObsCol<T> : ObservableCo

如何在VS2017中避免此警告消息(或:可能发生的情况):

“ObsCol.ObsCol()”包含导致调用虚拟方法的调用链
由类定义。
查看以下调用堆栈以了解意外后果:
ObsCol..ctor()
ObservableCollection.add\u CollectionChanged(NotifyCollectionChangedEventHandler):无效
代码如下:

[Serializable]
public class ObsCol<T> : ObservableCollection<T> 
{
   public ObsCol()
   {
      this.CollectionChanged += new NotifyCollectionChangedEventHandler(ObsCol_CollectionChanged);
   }       

   private void ObsCol_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
   {
       if (e.Action == NotifyCollectionChangedAction.Add)
       MainViewModel.IsDirty = e.NewItems != null || e.OldItems != null;

   }
}
[可序列化]
公共类ObsCol:observateCollection
{
公共ObsCol()
{
this.CollectionChanged+=新的NotifyCollectionChangedEventHandler(ObsCol\u CollectionChanged);
}       
私有void ObsCol\u CollectionChanged(对象发送方,notifycollectionchangedventargs e)
{
if(e.Action==NotifyCollectionChangedAction.Add)
MainViewModel.IsDirty=e.NewItems!=null | | e.OldItems!=null;
}
}
这一切都是为了在ViewModel中知道计算输出是否与输入数据相对应。 进入构造函数后,CollectionChanged为空,因此列表中只有我的处理程序

更改集合更改不会更改集合,是吗


事情似乎进展顺利,但…

问题在于:某些子类可能会覆盖事件,导致意外的构造行为

public class Boom<T> : ObsCol<T>
{
    public override event NotifyCollectionChangedEventHandler CollectionChanged
    {
        add { throw new NotImplementedException(); }
        remove { }
    }
}
封班

public sealed class Solution2<T> : ObservableCollection<T>
{
    public Solution2()
    {
        this.CollectionChanged += new NotifyCollectionChangedEventHandler(ObsCol_CollectionChanged);
    }

    ...
}
公共密封类解决方案2:可观察收集
{
公共解决方案2()
{
this.CollectionChanged+=新的NotifyCollectionChangedEventHandler(ObsCol\u CollectionChanged);
}
...
}
封杀事件

public class Solution3<T> : ObservableCollection<T>
{
    public sealed override event NotifyCollectionChangedEventHandler CollectionChanged
    {
        add { base.CollectionChanged += value; }
        remove { base.CollectionChanged -= value; }
    }


    ...
}
公共类解决方案3:ObservableCollection
{
公共密封覆盖事件NotifyCollectionChangedEventHandler CollectionChanged
{
添加{base.CollectionChanged+=value;}
删除{base.CollectionChanged-=value;}
}
...
}
你做什么取决于你的用例。。。第一种解决方案是最灵活的,因为您仍然可以创建具有各种覆盖的子类

使用您问题中的
SerializableAttribute
,密封整个类可能是值得的,因为您可能无论如何都不想序列化子类型(解决方案2)


如果您遇到
OnEvent
/
RaiseEvent
方法因任何原因不可用的情况,解决方案3只允许密封构造函数中使用的功能的最小子集。

为什么不重写该方法?请在使用该方法的地方张贴代码,因为我看不出任何错误。。。但是,您可以在没有静态ViewModel的情况下执行此操作,静态ViewModel很糟糕。我假设它是静态的,或者有一个静态的IsDirty成员。我猜代码使用的地方是问题所在??CollectionChanged事件声明为虚拟,因此不应在构造函数中使用,因此出现警告。啊,good@Clemens。我认为这是一个接口,没有注意继承。
public sealed class Solution2<T> : ObservableCollection<T>
{
    public Solution2()
    {
        this.CollectionChanged += new NotifyCollectionChangedEventHandler(ObsCol_CollectionChanged);
    }

    ...
}
public class Solution3<T> : ObservableCollection<T>
{
    public sealed override event NotifyCollectionChangedEventHandler CollectionChanged
    {
        add { base.CollectionChanged += value; }
        remove { base.CollectionChanged -= value; }
    }


    ...
}