好吧,所以我正努力尝试一些模式编程,以提高我的技能。我正在使用MVVM模式将Win Forms应用程序转换为WPF。该应用程序基本上是大型机会话的GUI。它浏览主机屏幕上的各种面板,抓取数据以进行最终编辑和更新。 我相信我已经掌握了MVVM的核心概念,但是有一个问题。
我已经构建了(耗尽100个左右的数据点)数据模型,它代表了我将要操作的对象的所有属性。我还在VIEWMODEL上创建了代理属性,它实现了INPC以便在VIEW上进行绑定。现在从我所读到的,获取数据的业务逻辑应该是MODEL的责任。 VIEWMODEL清理该数据并将其呈现给最终显示的VIEW。
所以这一切似乎都在运作,但问题在于:
[跳到这里问题]
如果MODEL控制业务逻辑并通过一系列不同的面板从大型机会话中提取数据,如何通过VIEWMODEL继续更新VIEW,了解数据拉取的位置。本质上是获取数据的MODEL的一种进度指示器。我知道我可以在MODEL上调用一个方法然后报告,但是如何在方法进度期间调用方法并报告,而不知道模型是否存在VIEWMODEL。这当然没有直接在MODEL上实现INPC。
感谢您的帮助,
Aaron Van
答案 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