2010-06-09 99 views
3

我確定對此有一個「簡單」的答案,但目前它逃脫了我。禁用向集合添加項目

在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 
} 

回答

5

總結您收藏的ReadOnlyCollection它給客戶之前,因爲你仍然有非只讀引用它,你可以改變它,他們將看到的變化,但他們不能改變它。有關示例,請參見here

+0

但當然!謝謝! – 2010-06-09 14:24:30

+0

這隻有在他不希望人們添加任何東西時纔有效。相反,他希望人們能夠添加項目...但只能通過他的自定義方法。 – 2010-06-09 14:24:51

+0

@Justin Niessner:但只要他保持對原始集合的引用應該沒問題?我沒有真正嘗試過,但這是MSDN頁面的引用:*如果對底層集合進行了更改,只讀集合反映了這些更改* – 2010-06-09 14:26:55

1

儘管需要一些工作,但我認爲能夠實現目標的唯一方法是創建一個新類,繼承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,它不允許任何人添加任何東西。