2

我有一个包含通用 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 类上的更新事件!

4

3 回答 3

5

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

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

特别是,这提供了:

  • IBindingList(由许多 UI 绑定组件使用,例如网格)
  • ListChanged - 您的代码可以订阅以获取详细通知
于 2009-04-08T11:20:44.140 回答
2

您想考虑将 anObservableCollection用于此目的。请参阅此 MSDN 文章以开始使用。

于 2009-04-08T11:21:33.000 回答
0

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

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

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

于 2009-04-08T11:24:31.090 回答