-1

WPF/XAML/C# 我将进度条的可见性设置为可见,然后在长时间运行后隐藏。我正在尝试使用 Task.Factory.StartNew 和 ContinueWith 来完成此操作。这部分工作正常,但出于某种原因,我的数据绑定到命令的导航按钮不会更新,直到我在漫长的过程之后实际单击屏幕。如果我省略 task.factory.startnew,按钮会正确更新(但我从未看到进度条)。我该如何解决?以下示例代码显示了 UI 中未更新的过程和按钮的问题:

private void DoWorkCommandExecuted()
        {
            //Do stuff
            ShowProgress = Visibility.Visible;

            Task.Factory.StartNew(() =>
                {
                    //Thread.Sleep(3000);
                    for (int i = 0; i < 10000; i++)
                    {
                        s += i.ToString();
                    }

                    ObservableCollection<string> temp = new ObservableCollection<string>();
                    temp.Add("One");
                    temp.Add("Two");
                    temp.Add("Three");
                    temp.Add("Four");
                    temp.Add("Five");

                    BillingCycles = temp;

                    SelectedBillingCycle = BillingCycles[0];
                })
                .ContinueWith(t =>
            {
                ShowProgress = Visibility.Hidden;
            });
        }

以及控制它启用的按钮代码的属性示例:

private bool CanFirst
        {
            get
            {
                bool b = false;

                if (BillingCycles != null)
                {
                    if (BillingCycles.Count > 0 && SelectedBillingCycle != BillingCycles[BillingCycles.Count - 1])
                    {
                        b = true;
                    }
                }

                return b;
            }
        }

我正在使用 INotifyPropertyChanged。这是一个非常基本的示例,说明了我的问题,这是一个更复杂的程序。“转到第一个”或“转到最后一个”按钮应根据所选择的 BillingCycle 启用/禁用。如果我不包含要在线程中运行的代码,则按钮将正确启用/禁用(我只是在进程发生时看不到进度条)。

4

2 回答 2

1

我相信它对您不起作用的原因是 CommandManager 在后台线程上调用了您的命令 CanExecute 方法,并且无法从那里更新按钮。操作完成后在 UI 线程上调用 command.RaiseCanExecuteChanged() 会导致系统在 UI 线程上重新评估,因此按钮更新有效。

于 2013-11-14T22:40:48.520 回答
0

值得检查您正在更新通知属性的线程,它应该是调度程序线程。如果没有 - 将 UpdateSourceTrigger 设置为 PropertyChanged 并且绑定应该是两种方式或一种方式。请让我知道是否有效

于 2013-11-14T22:54:09.477 回答