2011-11-11 3 views
3

작업자 스레드 (비 UI)에서 속성 값을 업데이트하는 경우 데이터 바인딩을 사용하고 속성 변경 내용을 수신하는 컨트롤에 반영됩니까?WPF 데이터 바인딩 스레드가 안전합니까?

관심을 가져 주셔서 감사합니다.

+1

그러나 ObservableCollection 컬렉션 수정 알림은 스레드로부터 안전하지 않습니다 (컬렉션 업데이트를 수동으로 UI 스레드로 다시 위임해야 함). –

답변

7

WPF는 Dispatcher를 사용하므로 모든 UI 스레드에서 작동하지만 스위치 유형 동시성을 갖습니다. 종속성 객체의 일부 소품을 업데이트하면 실제로 새로운 작업이 발송자 대기열에 게시됩니다. 해당 작업이 실행되면 UI 스레드에서 실행되고 컨트롤이 제대로 업데이트됩니다. 그러나 백그라운드 스레드에서 직접 컨트롤에 액세스하려고하면 예외가 발생합니다.

이 구현 때문에 확실한 경우가 있습니다. 예 : UI 스레드에서 prop를 업데이트하더라도 컨트롤이 변경 사항을 반영하도록 자동으로 업데이트 될 것이라고 기대할 수 없습니다. 이 같은

<TextBox x:name="tb" Text="{Binding Text"}/> 

그리고 코드 :이 같은 XAML을한다면, 업데이트가 다음 작업에 디스패처를 통해 갈 수 있기 때문에

var model = new { Text = "aaa" }; 
tb.DataContext = model; 
model.Text = "bbb"; 
Debug.Assert(tb.Text == "bbb"); 

어설, 실패 할 수 있습니다. 현재 통화가 종료되고 제어가 운영자에게 반환 될 때까지 업데이트되지 않습니다.

0

예. WPF 데이터 바인딩을 사용하는 주된 이점 중 하나는 실제로이 정확한 시나리오를 구현하는 것이 더 간단하도록 만드는 것입니다.

관련 문제