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

我有问题。找了很多,但找不到解决办法。我需要从另一个线程更新 ObservableCollection 而不冻结 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)

【问题讨论】:

    标签: c# wpf multithreading .net-4.0


    【解决方案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个参数
    • 并且它正在实现相同的接口?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多