MVVM WPF模型在加载数据时与ViewModel通信

时间:2012-04-02 16:29:11

标签: c# wpf mvvm inotifypropertychanged

好吧,所以我正努力尝试一些模式编程,以提高我的技能。我正在使用MVVM模式将Win Forms应用程序转换为WPF。该应用程序基本上是大型机会话的GUI。它浏览主机屏幕上的各种面板,抓取数据以进行最终编辑和更新。 我相信我已经掌握了MVVM的核心概念,但是有一个问题。

我已经构建了(耗尽100个左右的数据点)数据模型,它代表了我将要操作的对象的所有属性。我还在VIEWMODEL上创建了代理属性,它实现了INPC以便在VIEW上进行绑定。现在从我所读到的,获取数据的业务逻辑应该是MODEL的责任。 VIEWMODEL清理该数据并将其呈现给最终显示的VIEW。

所以这一切似乎都在运作,但问题在于:

[跳到这里问题]

如果MODEL控制业务逻辑并通过一系列不同的面板从大型机会话中提取数据,如何通过VIEWMODEL继续更新VIEW,了解数据拉取的位置。本质上是获取数据的MODEL的一种进度指示器。我知道我可以在MODEL上调用一个方法然后报告,但是如何在方法进度期间调用方法并报告,而不知道模型是否存在VIEWMODEL。这当然没有直接在MODEL上实现INPC。

感谢您的帮助,

Aaron Van

2 个答案:

答案 0 :(得分:1)

如果您使用后台线程,则可以使用BackgroundWorker并使用ProgressChanged事件将进度报告回ViewModel。由于这实际上是实现细节,您可以使用丰富的事件模型设计模型。

一种方式:

public enum MainframeLoadStage { StageOne, StageTwo, StageThree }

public class LoadingStageEventArgs : EventArgs {
     public MainframeLoadStage { get; set; }
}

class MyMainframeModel {
     public event EventHandler<LoadingStageEventArgs> StageLoaded;
}

或者,如果您在加载的每个“阶段”都需要精细的数据:

public class MyMainframeModel {
    public event EventHandler<LoadingStageOneEventArgs> StageOneLoaded;
    public event EventHandler<LoadingStageTwoEventArgs> StageTwoLoaded;
}

或者,如果需要,您可以通过传入回调和调用来报告模型上的单个操作的状态:

public class MyMainframeModel {
    public void Load (Action<LoadingMessage> callback);
}

更进一步,您可以考虑使用任务并行库(TPL)并使用其中的功能集:http://msdn.microsoft.com/en-us/library/dd537609.aspx

ViewModel 在所有这些中的作用当然是将这些事件从您的模型转换为最适合UI的形式(通常通过INPC,如您所述)。

答案 1 :(得分:0)

通常,ViewModel将具有获取数据而非实体模型的操作。因此,您的CustomerViewModel可能具有GetCustomers方法。

同时查看异步CTP,或者如果您使用的是Visual Studio 11,那么您不需要我相信的CTP。新的异步内容使得非常容易对UI线程上的进度指示器进行异步调用和调度更新。例如。

使用Async和Await进行异步编程 http://msdn.microsoft.com/en-us/library/hh191443(v=vs.110).aspx