2014-12-08 3 views
0

두 클라이언트 클래스간에 공유되는 ObservableCollection이 있습니다. 각자가 컬렉션을 변경할 수 있습니다. 그것이 발생하면 다른 클래스는 어떤 조치를 취해야합니다. 각 클라이언트 클래스가 자체 동작을 처리하지 않도록하려면 어떻게해야합니까?공유 할 관찰 가능한 컬렉션의 이벤트에서 자신의 동작을 처리하지 마십시오

+0

을 * flag *는 그것을 해결하기 위해 사용하기 쉽습니다. 콜렉션을 변경하기 전에'bool'을 설정하고, 다시 설정하십시오. 다른 클래스가 첫번째 이벤트 플래그를 체크하면 이벤트를받습니다. – Sinatr

답변

0

CollectionChanged 이벤트에 도움이 될만한 것이 표시되지 않습니다. sender은 컬렉션 자체 일 뿐이며 NotifyCollectionChangedEventArgs에는이 용도로 사용할 수있는 정보가 없습니다.

처음에는 각 클래스에서 CollectionChanged 이벤트를 구독하기 때문에 뭔가 추가되면들을 준비가되어 있다고 가정합니다. 그런 다음 한 클래스 나 다른 클래스의 항목을 추가하려고하면 먼저 이벤트를 구독 취소하고 항목을 추가 또는 제거한 다음 다시 구독하십시오.

public class SomeClass 
{ 
    ObservableCollection<int> myObservableColl = new ObservableCollection<int>(); 

    public SomeClass() 
    { 
     myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged; 
    } 

    private void AddItem(int number) 
    { 
     myObservableColl.CollectionChanged -= MainWindowViewModel_CollectionChanged; 
     myObservableColl.Add(number); 
     myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged; 
    } 

    private void MoveItem(int oldIndex, int newIndex) 
    { 
     myObservableColl.CollectionChanged -= MainWindowViewModel_CollectionChanged; 
     myObservableColl.Move(oldIndex, newIndex); 
     myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged; 
    } 

    // etc, etc. 
} 

당신이 방법의 전체 무리를 만들고 싶어하지 않은 경우,이 같은 일 정의 할 수 있습니다 :

private void ChangeCollectionWithoutNotification(Action action) 
{ 
    myObservableColl.CollectionChanged -= MainWindowViewModel_CollectionChanged; 
    action.Invoke(); 
    myObservableColl.CollectionChanged += MainWindowViewModel_CollectionChanged; 
} 

을 그리고 다음에 액션 통과 :

ChangeCollectionWithoutNotification(() => myObservableColl.Add(5)); 

ChangeCollectionWithoutNotification(() => myObservableColl.Move(1, 2)); 
+0

고마워, 그랜트. 나는 그것을 사용할 것이라고 생각한다. –

관련 문제