通常,如果我們有一個FrameworkElement
,我們無法從另一個Thread
更新其屬性。因爲它拋出一個Exception
Wpf TextBox.Text通過綁定在另一個線程中更新
public async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() => { MyTextBox.Background = new SolidBrushColor(Colors.Yellow); }
}
:例如,給定一個名爲TextBox
MyTextBox
,我們不能這樣做,因爲不同的線程擁有它
調用線程不能訪問該對象。
無論我們可以通過修改Background
通過Binding
(在另一個Thread
)
<TextBox Name="MyTextBox" Background="{Binding BoundBackground}"/>
在視圖模型設置它:
public async void SomeOperation()
{
await Task.Run(() => { BoundBackground = new SolidBrushColor(Colors.Yellow); }
}
因爲同樣的Exception
被拋出。
現在,這裏是「奇怪的」行爲。如果你想直接從另一個Thread
更新Text
屬性,像這樣:
public async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() => { MyTextBox.Text = "new text"; }
}
它拋出同樣的預期Exception
,但如果你綁定Text
屬性是這樣的:
<TextBox Text="{Binding BoundText}"/>
,並更新它從另一個Thread
由ViewModel:
public async void SomeOperation()
{
await Task.Run(() => { BoundText = "new text"; }
}
它神奇地工作KS。
我注意到這種行爲也爲ProgressBar
的Value
屬性。
這是一個錯誤,還是由設計製造,爲什麼?
我只能想象它的財產變更通知爲你工作。 BoundText的類型是什麼? – sellotape
@sellotape它顯然是一個字符串,否則我怎樣才能分配「新文本」值並將其綁定到Text屬性? –