c# - 创建一个在列表更新时触发的事件

标签 c# list observer-pattern

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

private static List<DataForm> dataForms = new List<DataForm>();

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

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

List 可通过属性从静态类中获得,如下所示:

   public static List<DataForm> DataForms
    {
        get { return dataForms; }
        //set { dataForms = value; }
    }

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

     DataFormSubject.DataForms.Add(new DataForm);

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

最佳答案

考虑使用 BindingList<T>ObservableCollection<T> ;这两者都以标准方式执行您想要的操作。

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

特别是,这提供了:

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

关于c# - 创建一个在列表更新时触发的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729552/

相关文章:

ios - AVPlayer 边界时间观察器偶尔无法触发

javascript - 带有单个字符串参数的 WebApi 2 POST 不起作用

c# - WPF DPI 问题

python - 在python中选择排序算法

java - 按元素对列表项进行分组以在 jsp 收据中使用

c# - 为什么我们需要观察者模式?

c# - 检测 "leaked"IDisposable 对象

c# - 刷新其中的数据时,是否必须从列表框中删除 selectedIndexChange 事件?

python - 在 Python 字典中存储和更新列表 : why does this happen?

java - 观察者模式小鬼