2011-11-11 121 views
3

如果屬性值是從工作線程(非UI)更新的,它是否會反映在使用數據綁定和偵聽屬性更改的控件中?WPF數據綁定線程安全嗎?

感謝您的關注。

+1

但值得注意的是,ObservableCollection集合修改通知是_not_線程安全的(集合更新需要手動委託回UI線程)。 –

回答

7

WPF正在使用分派器,因此一切都在一個UI線程上工作,但具有切換類型併發性。當你更新一些依賴對象的屬性時,它實際上會在調度器隊列中發佈一個新的作業。當該作業運行時,它將在UI線程上運行並正確更新控件。 但是,如果您嘗試直接從後臺線程訪問控件,則會收到異常。

由於此實現,存在某些邊緣情況。例如。即使你在UI線程上更新了道具,你也不能指望控件會同步更新它以反映你的變化。所以,如果你有XAML這樣的:

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

而且這樣的代碼:

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

斷言可能會失敗,因爲更新可以通過調度員進入下一個任務。並且它不會被更新,直到這個當前的調用結束並且控制返回給調度員。

0

是的。實際上,使用WPF數據綁定的主要優點之一是使實現這種確切場景變得更簡單。