2013-04-01 146 views
0

先打印,看看this question and answer。在答案中提供的代码中,没有调用PrintDialog.Showdialog(),因此此示例使用对话对象快速打印某些内容。印在WPF与MVVM - 从视图中显示PrintDialog类,但与视图模型

然而,PrintDialog本身就是一个视图,视觉打印是一个视图,所以我想这一切应该在视图中去。视图的数据在ViewModel中,打印的视图应该由视图构建,然后发送到打印机(就像视图将视觉信息触发到屏幕上一样)。这是以这种方式来思考MVVM的正确方法吗?

我想从视图中显示PrintDialog类用户,然后通过对话框到视图模型用于打印的,但它只是似乎打破MVVM背后的理念。

回答

2

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

其次,您传递的东西,显然是任何时候“视图”导向到您的视图模型,你违反了关注点分离。此外,视图模型中可阻止单元测试完成执行的任何活动应该是您正在打破MVVM的立即红旗。在这种情况下,显示并等待输入或处于模态状态的打印对话框会导致单元测试超时或挂起。

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

有关进一步的参考,当你认为你可能会采取错误的做法,以OOAD,看SOLID (object-oriented design)。这不是确定性的,但它是出色的指导。

+0

感谢您的回应,我甚至没有想过关闭服务类。我可能可以说我的问题更直接,但我不认为我完全知道我的问题是什么。但是,你的答案是完美的。 – Steve

+0

@Steve很乐意提供帮助。 –