【问题标题】:Prism/MVVM running code after switching a view切换视图后 Prism/MVVM 运行代码
【发布时间】:2015-01-29 13:08:55
【问题描述】:

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

我使用了快速入门“viewswitchingnavigation”。

所以我有一个带有导航和主面板/区域的外壳。 导航区域包含一些单选按钮来切换视图,这些视图被拆分为具有基于服务的模型的视图和视图模型。

视图 A 显示了一组文档,每个文档都有一个按钮,用于打开一个新视图 B 以查看该文档的详细信息。

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

所以。

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

【问题讨论】:

标签: wpf mvvm prism


【解决方案1】:

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

对于您的进度显示视图,您可以使用 Prism 提供的State-Based Navigation。您可以显示带有进度条或显示进度的文本框的顶部视图。像往常一样,视图的 UI 元素应该绑定到视图模型的属性。要更新这些 UI 属性,您应该使用 Dispatcher.Invoke()、SynchronizationContext 或类似的同步机制,因为您的进度报告方法(或事件)将由后台线程调用。

如果您可以发布您的代码,那么我的回答可能会更具体。

【讨论】:

    【解决方案2】:

    不完全确定您的目标,但这里有两个选项:

    是否应该在加载视图/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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多