创建列表更新时触发的事件

Cal*_*nus 2 c# list observer-pattern

我有一个静态类 (DataFormSubject),它包含一个通用 List 对象,如下所示:

private static List<DataForm> dataForms = new List<DataForm>();
Run Code Online (Sandbox Code Playgroud)

当列表更新时,需要告知依赖此列表的其他类,因此我创建了一个自定义事件,以及在添加或删除项目时可以触发的关联方法,如下所示:

    public delegate void DataFormsUpdatedHandler(object sender);
    public static event DataFormsUpdatedHandler DataFormsUpdatedEvent;

    public static void AddDataForm(DataForm df)
    {
        dataForms.Add(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }

    public static void RemoveDataForm(DataForm df)
    {
        dataForms.Remove(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }
Run Code Online (Sandbox Code Playgroud)

该列表可通过属性从静态类获取,如下所示:

   public static List<DataForm> DataForms
    {
        get { return dataForms; }
        //set { dataForms = value; }
    }
Run Code Online (Sandbox Code Playgroud)

但这里的问题是,客户端现在可以通过访问属性并在类上直接添加或删除来绕过更新事件!例如

     DataFormSubject.DataForms.Add(new DataForm);
Run Code Online (Sandbox Code Playgroud)

我怎样才能防止这种情况,或者有更好的方法来实现我想要的?理想情况下,我想要的是观察者可以订阅的 List 类上的更新事件!

Mar*_*ell 5

考虑使用BindingList<T>ObservableCollection<T>; 这两个都以标准方式做你想做的事。

你不能通过子类化做任何有趣的事情List<T>- 这些方法不是虚拟的。Collection<T>被设计为更具可扩展性,但在这种情况下,您需要的一切都已经提供了(由BindingList<T>)。

特别是,这规定:

  • IBindingList(由许多 UI 绑定组件使用,例如网格)
  • ListChanged - 您的代码可以订阅以获取详细通知