从另一个线程更新 ObservableCollection

Posted

技术标签:

【中文标题】从另一个线程更新 ObservableCollection【英文标题】:Update ObservableCollection from another thread 【发布时间】:2017-01-04 04:00:41 【问题描述】:

我有问题。找了很多,但找不到解决办法。我需要 而不冻结 UI。我正在使用NET4.0。 此代码不允许我看到“ProgressRing”和“Searching”消息。谢谢!

private void Search()
    

        ShowMessage = "Searching..."; // Message while the search is made.

        IsBusy = true; // Show WPF Toolkit BusyIndicator

        ShowProgressRing = true; // To show a ProgressRing in BusyIndicator

        Task.Factory.StartNew(() =>
        

            Articles = new ObservableCollection<Article>();

            /////////////////////////////
            //// Simulate SQL query ////
            ///////////////////////////

           for (var i = 0; i < 1000; i++)
           
               Articles.Add(new Article
               
                   Code = i.ToString(),
                   Name = "PRODUCT NAME",
                   Price = 1m
               );
           

        ).ContinueWith(x =>
        

            IsBusy = false; // Hide

        , TaskScheduler.FromCurrentSynchronizationContext());

     

编辑

private bool _showProgressRing;

public bool ShowProgressRing

    get  return _showProgressRing; 
    set
    
        _showProgressRing = value;
        RaisePropertyChanged("ShowProgressRing");
    


private bool _isBusy;

public bool IsBusy

    get  return _isBusy; 
    set
    
        _isBusy = value;
        RaisePropertyChanged("IsBusy");
    


private string _showMessage;

public string ShowMessage

    get  return _showMessage; 
    set
    
        _showMessage = value;
        RaisePropertyChanged("ShowMessage");
    

我的 VM 继承自 ViewModelBase (MVVM Light)

【问题讨论】:

【参考方案1】:

我假设您的 ShowMessage 是这样定义的:

     private string _ShowMessage ;
    public string ShowMessage 
    
        get
        
            return _ShowMessage;
        
        set
        
            this.Set<string>("ShowMessage ", ref this._ShowMessage , value);
        
    

与您的 IsBusy 属性相同:

         private string _IsBusy ;
    public bool IsBusy
    
        get
        
            return _IsBusy ;
        
        set
        
            this.Set<bool>("IsBusy ", ref this._IsBusy , value);
        
    

相同
         private string _ShowProgressRing;
    public bool ShowProgressRing 
    
        get
        
            return _ShowProgressRing;
        
        set
        
            this.Set<bool>("ShowProgressRing", ref this._ShowProgressRing, value);
        
    

整个类都继承自ObservableObject,你这样做了吗?

【讨论】:

文章类呢? 一个简单的类,只有5个参数 并且它正在实现相同的接口?

以上是关于从另一个线程更新 ObservableCollection的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个线程更新 GUI?

如何从另一个线程更新 GUI?

从另一个线程更新 excel 电子表格

从另一个线程更新 ObservableCollection

如何从另一个线程更新 GUI 上的文本框 [重复]

从另一个线程更新 QT 小部件的不那么冗长的方法?