【问题标题】:MVVM WPF Model Communicating with ViewModel while Loading Data加载数据时与 ViewModel 通信的 MVVM WPF 模型
【发布时间】:2012-04-02 16:29:10
【问题描述】:

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

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

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

[问题跳到这里]

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

感谢您的帮助,

亚伦·范

【问题讨论】:

    标签: c# wpf mvvm inotifypropertychanged


    【解决方案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,如您所说)。

    【讨论】:

    【解决方案2】:

    通常,ViewModel 将具有获取数据的操作,而不是实体模型。所以你的 CustomerViewModel 可能有一个GetCustomers 方法。

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

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

    【讨论】:

    • 我的印象是,模型应该不仅仅是存储数据的框架,它应该参与并自行获取数据。这样,如果您需要在另一个视图或应用程序的其他地方使用模型,则无需重写这些方法。我想最终我不会那么担心“纯”mvvm,但是在学习时我想遵循最佳实践,然后在我完全理解后偏离。
    • 它应该不仅仅是一个框架,当然。看看code.google.com/p/ndddsample/source/browse 或codecampserver.codeplex.com,那里有很多很好的例子。看看模型,他们不关心他们是如何被持久化的。该模型可以从 Web 服务或数据库中检索,您不希望这些问题存在于模型本身中。
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2017-11-21
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多