【问题标题】:Ho do I raise an event in a constructor?如何在构造函数中引发事件?
【发布时间】:2017-07-19 16:26:58
【问题描述】:

我有一个类,它的孩子在其中初始化并声明 ObservableCollections。我想在基类中收集子类的集合,以便稍后在通用方法中使用,所以我编写了一个事件处理程序,它在 ObservableCollection 的子类的构造函数中引发,并且处理程序被添加到我的 BaseView 类中.小提示:很多子视图确实已经存在,我想在不更改代码的情况下实现它。我的 ObservableCollection 孩子看起来像这样:

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);

我的 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>);
        }
    }

我现在的问题是,该事件没有引发,我不知道为什么......

编辑:

我现在选择了一种不同的方法,因为我在泛型类及其事件处理程序方面遇到了一些问题。我创建了一个新的静态类,它现在处理 Views 和 ObservableCollections 的构造函数调用。它在我手中发挥作用,我只期待一种类型的 ObservableCollection 类。现在我的代码如下所示:

基础视图:

public class BaseView<TObject>
{
    public List<ObservableCollection<int>> ObservableCollectionCollector = new List<ObservableCollection<int>>();
    public BaseView()
    {
        ObservableCollectionCollector = CollectionHandler.GetAndRemoveCollection();
    }
}

ObservableCollection:

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>);
        }
    }
}   

还有我的 CollectionHandler:

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);
}

顺便说一句。子视图可能如下所示:

public class ChildView : BaseView<string>
{
    ObservableCollection<int> collection = new ObservableCollection<int>();
    public ChildView()
        : base()
    {
    }
}

【问题讨论】:

    标签: c# events eventhandler


    【解决方案1】:

    您正在类的字段初始值设定项中创建 ObservableCollectionCollector 实例。

    字段初始化程序在类构造函数主体之前运行,因此它在您添加事件处理程序之前运行。您只需要在处理完静态事件后创建实例。

    【讨论】:

    • When you create an object, you only get the actual instance after its constructor finishes. 不完全正确。您可以访问对象实例在构造函数中,这是 OP 添加处理程序的地方。当然,他们仍然添加它为时已晚,即使它仍在构造函数中。
    • 为什么要关注静态事件?
    • @RandRandom:哎呀;我错过了那部分。
    • 不太明白你的答案,但它闻起来很腥。就是不能指手画脚。为什么初始化ObservableCollectionCollector跟事件有关系,没看错?!?
    • @RandRandom 该事件在初始化时被触发,因为它在其构造函数中触发事件。初始化的时候就是调用构造函数的时候。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多