【问题标题】:MVVM: Where to place certain logicMVVM:放置某些逻辑的位置
【发布时间】:2015-01-22 22:43:50
【问题描述】:

我正在将我的传统 WPF 代码隐藏应用程序迁移到 MVVM 模式。

到目前为止,我已将所有按钮处理程序移到 ModelView 中。

现在轮到执行这些功能的一些逻辑了。 由于不涉及 UI 交互,因此许多逻辑已放置在单独的类中,但逻辑的主要部分涉及运行一些任务,然后在这些阶段更新 UI,包括从后台工作人员更新提供的进度条。

我考虑将这个逻辑放入模型中,但似乎很难从模型中更新 UI(视图),所以打算放入 ViewModel。

这是个坏主意吗?如果有,为什么?

如果这个逻辑真的应该放在模型中,我应该如何更新 UI - 这些是该逻辑中的一些现有功能:

//if task is run update UI:
txtCurrentStatus.Text = "Preparing job...";
progressBar.IsIndeterminate = true;
progressBar.Value = 0;
txtPercentage.Text = "0%";

//When progress updates from reading a log, update progress bar
txtPercentage.Text = (percentOutput) + "%";
progressBar.Value = Convert.ToDouble(percentOutput);

【问题讨论】:

  • 不确定这是否真的回答了我的问题,不仅仅是进度条的问题。
  • 该链接显示了如何在 ViewModel 中使用后台工作人员更新进度条的示例,还显示了如何使用绑定更新视图的示例。如果您问是否可以将逻辑放入模型中,您会得到不同的意见。就我个人而言,我喜欢将我的模型保持为简单的 POCO。
  • 感谢您的 cmets。所以在你看来,你的程序逻辑在 ViewModel 中,而 Model 只是 data/get/setter?
  • 对于一个非常简单的一次性程序,我可能会这样做。但通常我在服务类中有我的业务逻辑,这些是使用 DI 提供给视图模型的。

标签: c# wpf mvvm


【解决方案1】:

我会这样设计:

  1. 创建一个LogReader 类。这实际上是模型的一部分
  2. 让该类引发UpdateProgress 事件
  3. ViewModel 拥有一个 LogReader 并监听该事件
  4. 在事件回调中,它在 ViewModel 上设置 CurrentProgress 属性
  5. 视图的进度条有Value="{Binding CurrentProgress}"

现在您对LogReader 的关注点有了很好的分离,视图数据在视图模型中并且绑定正在更新视图!

您当然可以将所有“阅读”逻辑保留在视图模型中,但它可能不属于那里。

【讨论】:

  • 嗨布拉德利,感谢您的回答。我不是 C# 专家,所以在你谈论的这些概念中挣扎。您能否进一步扩展数字 3 和 4 的含义?
  • @DanSewell 我很乐意,但您能否更具体地说明一下这些项目的混淆之处?
  • 那么,3. 'ViewModel 拥有一个 logReader'? “拥有”是什么意思? 4. 事件回调是什么意思。我会很感激一些指针,所以我可以调查这些。
  • @DanSewell 我的意思是“它拥有一个”的实例,这基本上意味着它有一个该类型的变量(当然非空)。对于(4),我的意思是你会写类似myLogReader.UpdateProgress += HandleProgressUpdate 的东西,其中HandleProgressUpdate 会更新CurrentProgress 属性。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2012-08-09
  • 2011-10-16
  • 2014-02-09
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多