在我看来,我有一个绑定到ObservableCollection的Grid。我的ViewModel包含ObservableCollection
public ObservableCollection<Session> Sessions
{
get
{
return _repository.GetSessions();
}
set
{
_sessions = value;
NotifyPropertyChanged("Sessions");
}
}
当某个操作在另一个ViewModel中发生时,我向事件聚合器发布一个事件,我在ViewModel中订阅该事件,该事件包含Sessions属性并修改Sessions ObjectCollection中的对象。
当我从UI线程向事件聚合器发布事件时,订阅者的事件处理程序完成工作并且UI按预期更新。
问题是当我从后台工作者向事件聚合器发布事件时。订阅者中的代码已执行,但UI未更新。
这里有一些代码:
SecondaryViewModel.cs从UI线程发布事件。
_eventAggregator.GetEvent<SomethingChangedEvent>().Publish("this changed");
在MainViewModel.cs中,我订阅了该事件并更新了一个属性,并且UI DOES 更新。
//The subscription
_eventAggregator.GetEvent<SomethingChangedEvent>().Subscribe(SomethingChangedEventHandler, ThreadOption.UIThread);
后台工作人员
//Check stuff in background
private void CheckSessionsInBackground()
{
//Show your wait dialog
var worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkerCompleted;
worker.RunWorkerAsync();
}
在DoWork方法中,我发布了一个事件
private void DoWork(object sender, DoWorkEventArgs e)
{
//Some other work
_eventAggregator.GetEvent<SomethingChangedEvent>().Publish("Changes from the background worker");
}
如果我在处理程序中停止执行,我可以确认代码正在执行,但UI不会更新。我的问题是,当消息发布到后台工作程序中的eventaggregator时,是否可以更新集合。我查看了使用Dispatcher的示例,但没有一个使用EventAggregator。欢迎任何帮助。