我确信这是一个“简单”的答案,但目前它逃脱了我。
在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
}
答案 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,它不允许任何人添加任何内容。