【问题标题】:Printing in WPF with MVVM - Display PrintDialog from view, but print with ViewModel使用 MVVM 在 WPF 中打印 - 从视图中显示 PrintDialog,但使用 ViewModel 打印
【发布时间】:2013-04-01 15:13:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net wpf mvvm printing


    【解决方案1】:

    首先,版主通常会关闭开放式的讨论,比如这样的问题。您应该缩小问题范围,以便得到明确的回答。

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

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

    当您认为您可能对 OOAD 采取了错误的方法时,如需进一步参考,请参阅 SOLID (object-oriented design)。这不是确定的,但它是很好的指导。

    【讨论】:

    • 感谢您的回复,我什至没有考虑传递一个服务类。我可能可以更直接地表达我的问题,但我认为我不知道我的问题是什么,确切地说。但是,您的答案是完美的。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多