代码之家  ›  专栏  ›  技术社区  ›  Wonko the Sane

禁用向集合添加项[重复]

  •  3
  • Wonko the Sane  · 技术社区  · 15 年前

    我相信这个问题有一个“简单”的答案,但就目前而言,它让我无法理解。

    在MVVM应用程序中,我有一个属性,它是一个ObservableCollection,用于在视图上显示一些元素集。

    private readonly ObservableCollection<MyType> mMyCollection = 
        new ObservableCollection<MyType>();
    public ObservableCollection<MyType> MyCollection
    {
        get { return mMyCollection; }
    }
    

    我希望限制此集合的使用者仅使用属性添加到集合中(即,我希望从视图中阻止此操作):

       viewModel.MyCollection.Add(newThing);   // want to prevent this!
    

    相反,我希望强制使用方法添加项,因为可能有另一个线程正在使用该集合,并且我不希望在该线程处理集合时修改该集合。

    public void AddToMyCollection(MyType newItem)
    {
        // Do some thread/task stuff here
    }
    
    2 回复  |  直到 13 年前
        1
  •  7
  •   Hans Olsson    15 年前

    将您的收藏包装在 ReadOnlyCollection 在将它提供给客户机之前,由于您仍然具有对它的非只读引用,因此您可以更改它,他们将看到更改,但无法更改。见 here 对于样品。

        2
  •  2
  •   Justin Niessner    15 年前

    虽然这需要一些工作,但我认为实现您的目标的唯一方法是创建一个新类,继承自 ObservableCollection<MyType> 藏起来 Add() 方法(通过new关键字)。

    你甚至可以实现 AddToMyCollection(MyType newItem) AS:

    public new void Add(MyType newItem)
    {
        // Do some thread/task stuff here
        // And call base.Add() if you need
    }
    

    这样,自定义方法的使用是透明的。

    如果您不希望任何人能够添加项目(通过add()或自定义方法),您只需返回一个readOnlyCollection,它不允许任何人添加任何内容。