通常、FrameworkElement
がある場合、そのプロパティを別のThread
から更新することはできません。それはException
をスローするのでWpf TextBox.Textバインドで別のスレッドで更新可能
public async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Run(() => { MyTextBox.Background = new SolidBrushColor(Colors.Yellow); }
}
に
:別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません例えば、
MyTextBox
という名前TextBox
与え、我々はこれを行うことはできません。
どちらもない我々はViewModelににそれを設定する(別のThread
中)
<TextBox Name="MyTextBox" Background="{Binding BoundBackground}"/>
Binding
を通じてBackground
を変更することができます。
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}"/>
とアップデートそれは別のからViewModelによってThread
:
public async void SomeOperation()
{
await Task.Run(() => { BoundText = "new text"; }
}
それは魔法のようにワks。
ProgressBar
のValue
プロパティでもこの現象が発生しています。
これはバグですか?そうではありませんか?設計によって作られた理由は何ですか?
私はそれがあなたのために働くプロパティー変更通知だと想像することができます。 BoundTextのタイプは何ですか? – sellotape
@sellotapeそれは明らかに文字列です。そうでなければ、「新しいテキスト」の値を割り当ててTextプロパティにバインドできますか? –