禁用将项添加到集合

时间:2010-06-09 14:18:37

标签: c# wpf collections mvvm

我确信这是一个“简单”的答案,但目前它逃脱了我。

在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 个答案:

答案 0 :(得分:7)

在将您的收藏品发送给客户之前,请将其整理到ReadOnlyCollection,因为您仍然可以对其进行非读取引用,您可以对其进行更改,但他们会看到更改,但无法对其进行更改。有关示例,请参阅here

答案 1 :(得分:2)

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

您甚至可以将AddToMyCollection(MyType newItem)实现为:

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

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

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