我在从另一个班级的后台工作人员更新单独打开的窗口的进度条时遇到问题。
程序执行如下:
- 主窗口加载
- 点击按钮做一些工作并打开一个弹出进度条(新打开的窗口)
- 后台工作人员确实工作并向弹出进度条报告进度
- 弹出进度条希望更新。
进度条值绑定到一个属性,在逐步调试器中,后台工作人员似乎可以更新该属性。这些更改不会反映在弹出进度条视图上。但是,绑定没有损坏,因为如果我手动尝试设置进度条的属性值,它可以正常工作。
此外,当我将进度条放在最初启动的 MainWindow 视图中时,它会更新得很好。有什么建议么??
这是一些代码:
主窗口视图模型
public class MainWindowViewModel: BaseViewModel
{
private void PerformSomeAction()
{
var popUpProgressBar = new PopUpProgressBarViewModel();
popUpProgressBar.Show(popUpProgressBar);
var worker = new BackgroundWorker { WorkerReportsProgress = true };
worker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
{
if (args.ProgressPercentage != popUpProgressBar.Progresser)
{
Progresser = args.ProgressPercentage;
popUpProgressBar.Progresser = args.ProgressPercentage;
}
};
worker.DoWork += delegate
{
for (int i = 0; i < 101; i++)
{
worker.ReportProgress(i);
System.Threading.Thread.Sleep(10);
}
MessageBox.Show("Done");
};
worker.RunWorkerAsync();
}
private int _progresser;
public int Progresser
{
get { return _progresser; }
set
{
if (_progresser == value) return;
_progresser = value;
OnPropertyChanged("Progresser");
}
}
private RelayCommand _startProcessing; //set private member
public ICommand StartProcessing //public field used by xaml binding
{
get
{
return _startProcessing = MakeCommandSafely(_startProcessing, () => PerformSomeAction());
}
}
}
PopUpProgressBarViewModel
public class PopUpProgressBarViewModel : BaseViewModel
{
private PopUpProgressBar _popUpProgressBar;
public void Show(PopUpProgressBarViewModel context)
{
_popUpProgressBar = new PopUpProgressBar {DataContext = context};
_popUpProgressBar.Show();
}
private int _progresser;
public int Progresser
{
get { return _progresser; }
set
{
if (_progresser == value) return;
_progresser = value;
OnPropertyChanged("Progresser");
}
}
}
有关完整的解决方案文件(这样您就可以看到发生了什么),请参见此处