【问题标题】:wpf binding: The calling thread cannot access this object because a different thread owns itwpf 绑定:调用线程无法访问此对象,因为不同的线程拥有它
【发布时间】:2012-12-07 21:46:34
【问题描述】:

从视图模型属性引发 NotifyPropertyChange 事件后,我收到此错误。

我在 setter 上添加了(作为测试)一个 UI Dispatcher.Invoke 调用,这似乎暂时解决了问题。

   public FeedTrackingSummary SelectedFeedTracking {
        get { return _selectedFeedTracking; }
        set { 
            Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => {
                _selectedFeedTracking = value; Notify("SelectedFeedTracking");
            }));
        }
    }

下面的 SelectedFeedTracking 是通过选择绑定到此属性的下拉值来设置的:

<ComboBox... SelectedItem="{Binding SelectedFeedTracking}"  />

选择下拉值后会发生错误。没有其他代码设置此属性。我想我的视图模型在发生这种情况时在后台线程中使用?

更新

我尝试删除对 INotifyPropertyChanged 的​​调用,并设置一个完全不同的属性,但错误仍然存​​在。所以我想这与整个视图模型的可访问性有关?

        set { 
            SelectedCalc = -1;
        }

【问题讨论】:

    标签: wpf multithreading


    【解决方案1】:

    一些 MVVM 框架(例如 Caliburn.Micro)有一个基本的 NotifyPropertyChanged 类,它会自动将属性更改通知(通过引发 PropertyChanged 事件)编组到所谓的“UI 线程”。

    因此,不必在每个属性设置器上都使用Application.Current.Dispatcher.Invoke(...),而是将该代码放入您的Notify() 方法中。因此,请确保每次通知 ViewModel 中的属性更改时都在 UI 线程中进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2012-06-03
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多