【问题标题】:Creating an event that triggers when a List is updated创建更新列表时触发的事件
【发布时间】:2010-10-18 06:58:43
【问题描述】:

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

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 类上的更新事件!

【问题讨论】:

  • 顺便说一句 - 涉及静态事件(直接或间接)的任何事情都可能导致问题。您需要非常严格地取消订阅,否则您将保持所有对象处于活动状态并耗尽内存。
  • 我也不喜欢为此使用静态类,但是我还能如何维护一个可以在整个应用程序中访问的单个集合,而无需将集合从一个对象传递到另一个对象?

标签: c# list observer-pattern


【解决方案1】:

不显示静态类中的 IList,只显示 Enumerable:

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

这样所有更改都必须通过您的班级完成

【讨论】:

  • 静态类有通知事件。
【解决方案2】:

您想考虑将ObservableCollection 用于此目的。请参阅this MSDN article 以开始使用。

【讨论】:

    【解决方案3】:

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

    你不能通过继承List&lt;T&gt; 来做任何有趣的事情——这些方法不是虚拟的。 Collection&lt;T&gt; 被设计为更具可扩展性,但在这种情况下,您需要的一切都已经提供(BindingList&lt;T&gt;)。

    特别是,这提供了:

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 2015-07-25
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多