创建在更新List时触发的事件

时间:2009-04-08 11:19:34

标签: c# list observer-pattern

我有一个静态类(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; }
    }

但问题是客户端现在可以通过访问属性并在类上直接添加或删除来绕过更新事件! E.g。

     DataFormSubject.DataForms.Add(new DataForm);

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

3 个答案:

答案 0 :(得分:4)

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

通过子类化List<T>,你无法做任何有趣的事情 - 方法不是虚拟的。 Collection<T>旨在更具可扩展性,但在这种情况下,您需要的所有内容都已提供(BindingList<T>)。

特别是,这提供了:

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

答案 1 :(得分:2)

您希望将ObservableCollection用于此目的。请参阅this MSDN article开始使用。

答案 2 :(得分:0)

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

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

这样所有更改都必须通过您的课程

完成