【发布时间】:2010-11-15 15:59:12
【问题描述】:
我想更新我的用户界面。我应该使用 BackgroundWorker 吗?我是将 BackgroundWorker 放在 MainWindowViewModel 中并再次实例化存储库,还是将它放在 OrdersQueueViewModel 中并对属性做一些事情?
UI 只显示由 LINQ 创建的列表的内容。这些列表是 ObservableCollection 并且是 OrdersQueueViewModel 的属性。我有一个创建集合 ViewModels 的 ViewModel MainWindowViewModel,以便我可以从 MainWindow.xaml(视图)绑定到该集合。
MainWindowViewModel.cs:
public MainWindowViewModel()
{
_printQueueRepos = new OrdersPrintQueueRepository();
_holdQueueRepos = new OrdersHoldQueueRepository();
_linesToPickRepos = new LinesToPickRepository();
_linesPerHourRepos = new LinesPerHourRepository();
//create an instance of viewmodel and add it to the collection
OrdersQueueViewModel viewModel = new OrdersQueueViewModel(_printQueueRepos, _holdQueueRepos, _linesToPickRepos, _linesPerHourRepos);
this.ViewModels.Add(viewModel);
}
MainWindow.xaml:
<Window.Resources>
<DataTemplate DataType="{x:Type vm:OrdersQueueViewModel}">
<vw:OrdersQueueView></vw:OrdersQueueView>
</DataTemplate>
</Window.Resources>
OrderQueueViewModel 中使用存储库的属性示例:
public ObservableCollection<LinesToPick> LinesToPick
{
get
{
return new ObservableCollection<LinesToPick>(_linesToPickRepos.GetLinesToPick());
}
}
所以我在 OrdersQueueView 中绑定了LinesToPick,并且随着数据库的更新,UI 中的列表应该会发生变化。我花了一些时间阅读有关 BackgroundWorker 的信息,但我不太确定如何更新列表。我希望因为它们是ObservableCollections 我可以“刷新”它们,它们将使用 INotifyPropertyChanged 并自动更新 UI。对这一切都非常陌生,我试图理解它,在此先感谢您的帮助。
编辑:使用 James 的建议,我在我的 OrdersQueueViewModel 中得到了这个结果。但是,当代码到达 2 个列表上的 .Clear() 时,我收到错误“这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection”,这是我认为调度程序的用途。有什么建议吗?
Action workAction = delegate
{
_worker = new BackgroundWorker();
_worker.DoWork += delegate
{
LinesThroughput.Clear();
LinesToPick.Clear();
//refresh LinesToPick
foreach (var item in _linesToPickRepos.GetLinesToPick())
{
LinesToPick.Add(item);
}
//refresh LinesThroughput
List<LinesThroughput> Lines = new List<LinesThroughput> (_linesPerHourRepos.GetLinesThroughput());
foreach (var item in GetLinesThroughput(Lines))
{
LinesThroughput.Add(item);
}
};
_worker.RunWorkerAsync();
};
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, workAction);
【问题讨论】:
标签: wpf mvvm backgroundworker observablecollection