0

首先,看一下这个问答。在答案中提供的代码中,没有调用PrintDialog.Showdialog(),所以这个例子是使用对话框对象来快速打印一些东西。

但是,它PrintDialog本身是一个视图,而要打印的视觉对象是一个视图,所以我认为所有这些都应该放在视图中。视图的数据在 ViewModel 中,要打印的视图应该由视图构建,然后发送到打印机(就像视图将视觉效果发送到屏幕一样)。这是以这种方式思考 MVVM 的正确方法吗?

我正在考虑从视图中向用户显示 PrintDialog,然后将对话框传递到视图模型中进行打印,但这似乎打破了 MVVM 背后的想法。

4

1 回答 1

2

首先,版主通常会关闭开放式的讨论,像这样的问题。你应该缩小你的问题,以便可以明确回答。

其次,任何时候你将一些明显面向“视图”的东西传递到你的视图模型中,你就违反了关注点分离。此外,视图模型中任何可能阻止单元测试完成执行的活动都应该是您正在破坏 MVVM 的直接危险信号。在这种情况下,显示并等待输入或处于模态状态的打印对话框将导致单元测试超时或挂起。

解决方案是传递一个服务类,它执行打印网格、显示对话框以及完成工作所需的任何工作。在 MVVM 中,我们大多数人使用依赖注入 (DI) 来执行此操作(我使用 MEF)。您将创建另一个具有相同接口的服务以供您的测试使用,该服务不会阻止执行。在这种情况下,该服务是一个视图层服务,并且不应依赖于视图模型。viewmodel 唯一知道的是它有一个服务接口可以调用,而服务唯一知道的 viewmodel 是它为此交互实现的接口(除非您可以通过它在服务上设置所有需要的数据)自己的界面)。

当您认为您可能对 OOAD 采取了错误的方法时,有关进一步的参考,请参阅SOLID(面向对象设计)。它不是确定的,但它是极好的指导。

于 2013-04-09T20:32:28.487 回答