C# 我如何在构造函数中引发事件?
我有一个类,它的子类初始化并声明ObservableCollections。我想在基类中收集child的集合,以便稍后在泛型方法中使用,因此我编写了一个事件处理程序,该事件处理程序在ObservableCollection子类的构造函数中提出,并将该处理程序添加到我的BaseView类中。注意:很多子视图已经存在,我希望在不更改它们的代码的情况下实现它。我的ObservableCollection孩子看起来像这样:C# 我如何在构造函数中引发事件?,c#,events,eventhandler,C#,Events,Eventhandler,我有一个类,它的子类初始化并声明ObservableCollections。我想在基类中收集child的集合,以便稍后在泛型方法中使用,因此我编写了一个事件处理程序,该事件处理程序在ObservableCollection子类的构造函数中提出,并将该处理程序添加到我的BaseView类中。注意:很多子视图已经存在,我希望在不更改它们的代码的情况下实现它。我的ObservableCollection孩子看起来像这样: public class ObservableCollection<T&g
public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
public ObservableCollection()
:base()
{
OnConstructorCalled(new ConstructorCalledEventArgs(this));
}
public static event ConstructorCalledEventHandler ConstructorCalled;
protected static void OnConstructorCalled(ConstructorCalledEventArgs e) => ConstructorCalled?.Invoke(e.Sender, e);
}
public class ConstructorCalledEventArgs : EventArgs
{
public object Sender;
public ConstructorCalledEventArgs(object sender)
{
Sender = sender;
}
}
public delegate void ConstructorCalledEventHandler(object sender, ConstructorCalledEventArgs e);
public class ChildView : BaseView<string>
{
ObservableCollection<int> collection = new ObservableCollection<int>();
public ChildView()
: base()
{
}
}
公共类ObservableCollection:System.Collections.ObjectModel.ObservableCollection
{
公共可观测集合()
:base()
{
OnConstructor Called(新建Constructor CalledEventArgs(本));
}
公共静态事件构造函数calledEventHandler构造函数called;
ConstructorCalled(ConstructorCalledEventArgs e)=>ConstructorCalled?Invoke(e.Sender,e)上受保护的静态无效空间;
}
公共类构造函数CalledEventArgs:EventArgs
{
公共对象发送器;
公共构造函数CalledEventArgs(对象发送方)
{
发送方=发送方;
}
}
公共委托void构造函数CalledEventHandler(对象发送方,构造函数CalledEventArgs e);
我的BaseView看起来像这样
protected ObservableCollection<ObservableCollection<TObject>> ObservableCollectionCollector = new ObservableCollection<ObservableCollection<TObject>>();
protected BaseView()
{
ObservableCollection<TObject>.ConstructorCalled += OnCollectionDeclared;
}
private void OnCollectionDeclared(object sender, ConstructorCalledEventArgs e)
{
if (sender is ObservableCollection<TObject>)
{
ObservableCollectionCollector.Add(sender as ObservableCollection<TObject>);
}
}
受保护的ObservaleCollection ObservaleCollectionCollector=新的ObservaleCollection();
受保护的BaseView()
{
ObservableCollection.ConstructorCalled+=OnCollectionDeclared;
}
声明的CollectionPrivate void(对象发送方、构造函数CalledEventArgs e)
{
如果(发送方是可观察的收集)
{
添加(发送方作为ObservableCollection);
}
}
我现在的问题是,事件没有被提出,我不知道为什么
编辑:
我现在选择了一种不同的方法,因为我对泛型类及其事件处理程序有一些问题。我创建了一个新的静态类,它现在处理视图和ObservableCollections的构造函数调用。在我看来,我只希望看到一种类型的ObservableCollection类。现在,我的代码如下所示:
BaseView:
public class BaseView<TObject>
{
public List<ObservableCollection<int>> ObservableCollectionCollector = new List<ObservableCollection<int>>();
public BaseView()
{
ObservableCollectionCollector = CollectionHandler.GetAndRemoveCollection();
}
}
公共类基本视图
{
public List observeCollectionCollector=new List();
公共BaseView()
{
ObservableCollectionCollector=CollectionHandler.GetAndRemoveCollection();
}
}
可观察收集:
public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
public ObservableCollection()
: base()
{
AddToCollectionHandler();
}
private void AddToCollectionHandler()
{
if (this is ObservableCollection<int>)
{
CollectionHandler.AddToCollection(this as ObservableCollection<int>);
}
}
}
公共类ObservableCollection:System.Collections.ObjectModel.ObservableCollection
{
公共可观测集合()
:base()
{
AddToCollectionHandler();
}
私有void AddToCollectionHandler()
{
如果(这是可观察收集)
{
CollectionHandler.AddToCollection(这称为ObservableCollection);
}
}
}
还有我的收藏家:
static class CollectionHandler
{
private static List<ObservableCollection<int>> collection = new List<ObservableCollection<int>>();
public static List<ObservableCollection<int>> GetAndRemoveCollection()
{
List<ObservableCollection<int>> col = collection;
collection = new List<ObservableCollection<int>>();
return col;
}
public static void AddToCollection(ObservableCollection<int> item) => collection.Add(item);
}
静态类CollectionHandler
{
私有静态列表集合=新列表();
公共静态列表GetAndRemoveCollection()
{
列表col=集合;
集合=新列表();
返回列;
}
公共静态void AddToCollection(ObservableCollection项)=>collection.Add(项);
}
顺便说一句,子视图可能如下所示:
public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
public ObservableCollection()
:base()
{
OnConstructorCalled(new ConstructorCalledEventArgs(this));
}
public static event ConstructorCalledEventHandler ConstructorCalled;
protected static void OnConstructorCalled(ConstructorCalledEventArgs e) => ConstructorCalled?.Invoke(e.Sender, e);
}
public class ConstructorCalledEventArgs : EventArgs
{
public object Sender;
public ConstructorCalledEventArgs(object sender)
{
Sender = sender;
}
}
public delegate void ConstructorCalledEventHandler(object sender, ConstructorCalledEventArgs e);
public class ChildView : BaseView<string>
{
ObservableCollection<int> collection = new ObservableCollection<int>();
public ChildView()
: base()
{
}
}
公共类子视图:BaseView
{
ObservableCollection集合=新的ObservableCollection();
公共儿童视图()
:base()
{
}
}
您正在类的字段初始值设定项中创建ObservableCollectionCollector
实例
字段初始值设定项在类构造函数体之前运行,因此在添加事件处理程序之前运行。您只需要在处理静态事件后创建实例。您正在类的字段初始值设定项中创建
ObservableCollectionCollector
实例
字段初始值设定项在类构造函数体之前运行,因此在添加事件处理程序之前运行。您只需要在处理静态事件后创建实例。
当您创建对象时,您只需要在其构造函数完成后获得实际实例。
严格来说不是真的。您可以访问构造函数中的对象实例,OP将在其中添加处理程序。当然,即使它仍然在构造函数中,他们添加它仍然太迟了。为什么这应该与静态事件有关?@RandRandom:Oops;我错过了那部分。我真的不明白你的答案,但它闻起来有点可疑。只是不能用手指指着它。为什么初始化ObservableCollectionCollector
与事件有关,看不出错误@RandRandom事件在初始化时被激发,因为它在其构造函数中激发事件。当它初始化时,它调用构造函数。当你创建一个对象时,你只会在它的构造函数完成后得到实际的实例。
严格来说不是真的。您可以访问构造函数中的对象实例,OP将在其中添加处理程序。当然,即使它仍然在构造函数中,他们添加它仍然太迟了。为什么这应该与静态事件有关?@RandRandom:Oops;我错过了那部分。我真的不明白你的答案,但它闻起来有点可疑。只是不能用手指指着它。为什么初始化ObservableCollectionCollector
与事件有关,看不出错误@RandRandom事件在初始化时被激发,因为它在其构造函数中激发事件。初始化时是调用构造函数时。