通常,如果我们有一个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属性? –