几天前我开始使用Prism(5.0),现在我遇到了一个我无法解决的问题。
我使用了快速启动" viewswitchingnavigation"。
所以我有一个带导航和主面板/区域的shell。 导航区域包含一些单选按钮,可以使用基于服务的模型切换分割为视图和视图模型的视图。
视图A显示了一个文档集合,每个文档都有一个按钮,用于打开此文档详细信息的新视图B.
此详细视图中的按钮应该启动代码的一部分。由于需要解析数据,此代码会移动一些需要很长时间的数据。由于用户不应该等待非反应窗口,我想显示一些有关正在运行的代码状态的信息。 (示例:获取数据1/3012,使用每个新获取的数据块进行更新)。这段代码一次获取一个数据,所以我可以向视图发送(?)一些信息来更新那里的状态(如果我知道的话)
所以
答案 0 :(得分:1)
您可以使用具有内置进度报告功能的BackgroundWorker
类。或者,您可以使用async
/ await
和Task
来创建自己的异步数据检索机制。
对于显示进度的视图,您可以使用Prism提供的State-Based Navigation。您可以使用进度条或显示进度的文本框显示顶部视图。像往常一样,视图的UI元素应绑定到视图模型的属性。要更新这些UI属性,您应该使用Dispatcher.Invoke()
或SynchronizationContext
或类似的同步机制,因为您的进度报告方法(或事件)将由后台线程调用。
如果您可以发布您的代码,那么我的答案可能更具体。
答案 1 :(得分:0)
不完全确定你的目标,不过这里有两个选择:
View / Windows加载后是否应该开始获取数据?然后,您的ViewModel必须实现INavigationAware
接口和INavigationAware.OnNavigatedTo
(和From)方法)。您可以将该方法标记为async
,以便能够在其中使用await
。
public async void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
{
await LongRunningTask();
}
public async Task LongRunningTask()
{
foreach(var dataChunk in allData)
{
// Status Text is a property which raises OnPropertyChanged when changed and which you databind to a textbox
StatusText = string.Format("Getting Data {0}", dataChunk.Description);
await ProcessDataChunk(dataChunk);
}
}
或者,如果您希望它发生在用户操作上,则可以通过异步ICommand
进行。
private ICommand processCommand;
public ICommand ProcessCommand)
{
return processCommand??(processCommand = DelegateCommand.FromAsyncHandler(this.LongRunningTask));
}