切换视图后Prism / MVVM运行代码

时间:2015-01-29 13:08:56

标签: wpf mvvm prism

几天前我开始使用Prism(5.0),现在我遇到了一个我无法解决的问题。

我使用了快速启动" viewswitchingnavigation"。

所以我有一个带导航和主面板/区域的shell。 导航区域包含一些单选按钮,可以使用基于服务的模型切换分割为视图和视图模型的视图。

视图A显示了一个文档集合,每个文档都有一个按钮,用于打开此文档详细信息的新视图B.

此详细视图中的按钮应该启动代码的一部分。由于需要解析数据,此代码会移动一些需要很长时间的数据。由于用户不应该等待非反应窗口,我想显示一些有关正在运行的代码状态的信息。 (示例:获取数据1/3012,使用每个新获取的数据块进行更新)。这段代码一次获取一个数据,所以我可以向视图发送(?)一些信息来更新那里的状态(如果我知道的话)

所以

  1. 如何实现启动"外部"的按钮码?
  2. 如何访问当前视图(例如,更改加载程序或文本框中显示的状态,如上所述。

2 个答案:

答案 0 :(得分:1)

您可以使用具有内置进度报告功能的BackgroundWorker类。或者,您可以使用async / awaitTask来创建自己的异步数据检索机制。

对于显示进度的视图,您可以使用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));
}