2010-06-09 9 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

물론! 고맙습니다! –

+0

그는 사람들이 아무것도 추가하지 않기를 바랄 뿐이다. 대신, 그는 사람들이 아이템을 추가 할 수 있기를 원하지만 자신의 커스텀 메소드를 통해서만 가능합니다. –

+0

@Justin Niessner :하지만 원래 컬렉션에 대한 참조를 유지하는 한 괜찮을까요? 실제로 시도하지는 않았지만 이것은 MSDN 페이지에서 인용 한 것입니다. * 기본 컬렉션에 변경 사항이있는 경우 읽기 전용 컬렉션은 해당 변경 사항을 반영합니다. * –

1

목표가 달성 될 수 있다고 생각하는 유일한 방법은 ObservableCollection<MyType>에서 상속 받고 새 키워드를 사용하여 Add() 메서드를 숨기는 것입니다.

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

그런 식으로, 사용자 정의 방식의 사용이 투명 :

당신은 AddToMyCollection(MyType newItem)과 같이 구현할 수 있습니다.

아무도 (Add() 또는 사용자 지정 메서드를 통해) 항목을 추가 할 수 없도록하려면 아무도 아무 것도 추가 할 수 없도록하는 ReadOnlyCollection을 반환하면됩니다.