2010-02-18 4 views
1

오프 사이트 개발 팀은 ObservableCollection 속성이있는 Model을 만들었습니다. 이제는 ViewModel을 작성하는 책임을 맡았고, Model이 BackgroundWorker (다른 스레드)에서 실행되기 때문에 문제가 발생합니다. 즉, CollectionChanged 이벤트를 후크하여 View를 업데이트 할 수 없습니다.Model에서 ObservableCollection + ViewModel에서 스레딩

private Model model = new Model(); 
public ObservableCollection<Entry> Entries { get; set; } 

public ctor() 
{ 
    BackgroundWorker peon = new BackgroundWorker(); 
    peon.DoWork += work; 
    peon.RunWorkerCompleted += updateViewCollection; 
    peon.RunWorkerAsync(); 
} 

private void work(object sender, DoWorkEventArgs e) 
{ 
    model.DoSomething(); 
} 

private void updateViewCollection(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // model.entries is an ObservableCollection<Entry> 
    foreach (Entry en in this.model.entries) 
    { 
     if (!this.Entries.Contains(en)) 
      this.Entries.Add(en); 
    } 
} 

이 스레드의 ViewModel을 통해보기의 ObservableCollection에에 모델의 ObservableCollection에 후크 수있는 더 나은 방법이 있나요 : 여기에 내가했던 해결 방법입니까?

답변

0

wpf 또는 silverlight를 사용한다고 가정합니다. 단일 스레드에서와 동일하게 이벤트를 후크하지만 Dispatcher 오브젝트 (Invoke())로 마샬링합니다. 관찰 가능한 컬렉션이 스레드 안전하다고 가정하면 아무런 문제가 없어야합니다.

0

그것은 속성이 자동으로이 UI 스레드로 마샬링 것으로 변경 구현하는 뷰 모델 기반을 가지고이 http://nuget.org/List/Packages/Caliburn.Micro.INPC

를 살펴 보자. BindableCollection이라는 동일한 작업을 수행하는 ObservableCollection을 확장하는 클래스도 있습니다.

관련 문제