2012-04-05 10 views
2

새 스레드를 시작하고 내 View Model에 정의 된 속성을 통해 UI 요소를 업데이트하려고하는데 오류없이 수행 할 수 있지만 코드 숨김을 통해 UI 요소를 업데이트하려고하면 알려진 UI가 throw됩니다 액세스 오류 ("다른 스레드가 소유하고 있기 때문에 호출하는 스레드가이 객체에 액세스 할 수 없습니다."). 첫 번째 질문은 .. 두 가지 접근 방식의 차이점은 무엇입니까? 두 번째 질문은 ViewModel에서 Disptacher를 사용하는 것이 가장 이상적일까요? 버튼에 ICommand의 속성을 통해 호출 MVVM WPF를 사용하는 MVVM patern에는 Dispatcher가 필요하지 않습니까?

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Thread th = new Thread(new ThreadStart(delegate() 
      { 
       textbox.Text = "Rajib"; 
      } 
     )); 

     th.Start(); 
    } 

//inside XAML 
<TextBox x:Name="textbox" Text="{Binding UserInput, Mode=TwoWay}" /> 

뒤에

코드
public string UserInput 
    { 
     get { return _UserInput; } 
     set { _UserInput = value; OnPropertyChanged("UserInput"); } 
    } 

// 공공 무효 ExecuteCommand를 (객체 OBJ) { InvokeCallThroughAnonymousDelegateThread()를 클릭; }

private void InvokeCallThroughAnonymousDelegateThread() 
    { 
     ThreadStart start = delegate() 
     { 
      UserInput = "Calling from diff thread"; 
     };   
     new Thread(start).Start(); 
    } 

답변

7

UI를 업데이트하려는 모든 작업은 발송자 스레드 내에서 수행해야합니다. 그러나 속성 변경 이벤트의 경우 WPF 은 이벤트가 백그라운드 스레드에서 발생하면을 자동으로 전달합니다.

http://bea.stollnitz.com/blog/?p=34

그들은 INotifyCollectionChanged 이벤트에 대한 동일한 기능을 수행 할 예정되었지만 이전 릴리스에 주위에있어 결코 : 당신은 블로그 베아 코스타의 (PM 바인딩 전 WPF 데이터)에이에 대한 자세한 내용을보실 수 있습니다. INotifyPropertyChanged 이외에 4.5 they will now be synchronizing collection changed events automatically의 경우

2

NotifyPropertyChanged 이벤트를 통해 WPF에 의해 변경된 스레드 컨텍스트를 가지고 있지만, 코드가 뒤에 UI 스레드에 대한 스레드 컨텍스트를 변경하지 않습니다. 당신의 코드 숨김에서,이 대신 사용 : 직접 Dispatcher를 사용하는 경우에 대해서는

Task.Factory.StartNew(() => 
     { 
      // Background work 
     }).ContinueWith((t) => { 
      // Update UI thread 

     }, TaskScheduler.FromCurrentSynchronizationContext()); 

, 내가 어떤 뷰 모델에서 Dispatcher를 사용하지 않은 중간 크기의 프로젝트가 있습니다. Xaml 자원, 취약한 이벤트 처리를 처리하기 위해이 도구를 사용했으며 MefedMVVM 및 Prism 내부에서도 사용됩니다.

관련 문제