Wpf 从另一个线程进行绑定和更新
我刚刚注意到我可以从另一个线程更新绑定源代码,它可以正常工作 因此,我在下面准备了一个演示,我的问题是:Wpf 从另一个线程进行绑定和更新,wpf,multithreading,binding,Wpf,Multithreading,Binding,我刚刚注意到我可以从另一个线程更新绑定源代码,它可以正常工作 因此,我在下面准备了一个演示,我的问题是: 为什么绑定工作?为什么来自另一个线程的上升通知不会抛出 像这样从另一个线程更新源代码合法吗 我总是使用并告诉其他人使用Dispatcher.Invoke,但也许我只是不知道什么?也许绑定总是保证在UI线程或类似的东西中更新其目标 在后台线程上设置源属性是完全合法的。框架在引擎盖下为您处理封送 但是,如果尝试从源集合中添加或删除项,则情况不同: 但是,只能在最初创建对象的线程上访问目标
- 为什么绑定工作?为什么来自另一个线程的上升通知不会抛出
- 像这样从另一个线程更新源代码合法吗
Dispatcher.Invoke
,但也许我只是不知道什么?也许绑定总是保证在UI线程或类似的东西中更新其目标
在后台线程上设置源属性是完全合法的。框架在引擎盖下为您处理封送 但是,如果尝试从源集合中添加或删除项,则情况不同:
但是,只能在最初创建对象的线程上访问目标属性,或者更确切地说是
依赖对象的属性。但是您不需要使用调度程序从后台线程设置视图模型属性。在后台线程上设置源属性是完全合法的。框架在引擎盖下为您处理封送
但是,如果尝试从源集合中添加或删除项,则情况不同:
但是,只能在最初创建对象的线程上访问目标属性,或者更确切地说是依赖对象的属性。但是您不需要使用dispatcher从后台线程设置视图模型属性。更新绑定的ObservableCollection
的Add()
方法确实会引发(不同的)异常。分配一个新实例,或者如果它是未绑定的,将只起作用。有趣的。。。任何类型的证明在任何(即在非ui)线程中可以执行什么赋值?@Sinatr:您应该能够设置数据绑定源属性,但不能修改数据绑定集合。更新绑定可观测集合的方法(例如调用Add()
方法)确实会引发(不同的)异常。分配一个新实例,或者如果它是未绑定的,将只起作用。有趣的。。。任何类型的证明在任何(即在非ui)线程中可以执行什么赋值?@Sinatr:您应该能够设置数据绑定源属性,但不能修改数据绑定集合。
<TextBox x:Name="textBox" Text="{Binding Text}" />
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string Text { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Task.Run(() =>
{
Thread.Sleep(3000); // just wait long enough to ensure window is shown
// works
Text = "123";
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Text)));
// will crash with
// System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it'
textBox.Text = "123";
});
}
}