Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 从另一个线程进行绑定和更新_Wpf_Multithreading_Binding - Fatal编程技术网

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";
        });
    }
}