请问有人可以花一点时间解释这些是如何联系的吗?我正在查看此文章: http://msdn.microsoft.com/en-us/library/gg430869(v=pandp.40).aspx 但我似乎没有理解我要寻找的内容。
D J提供了一个好的答案,不过我想在这个讨论中补充一些额外的想法。
根据我的经验,当视图不依赖于视图模型才能正常运行时(无论是代码后台、附加行为、混合行为还是自定义控件逻辑),视图行为通常很有用。如果一个视图(UserControl
、Window
、Page
等)在没有视图模型的情况下在逻辑上没有意义,那么将行为从视图中删除并将其移动到视图模型中可能更有意义。
虽然我们可以使用各种类型的行为做任何事情,但通常不明智。MVVM出于良好的原因限制了我们应该做什么,以便我们可以观察关注点分离,以提高应用程序的凝聚力并解耦我们的类。这两个概念是软件可维护性的全部,随着应用程序发展为企业软件,这些概念变得越来越重要。
重要的是要考虑行为所涉及的关注点。了解这一点将有助于我们找到一个合适的位置。以下是一些问题,可以帮助我们确定它属于哪个位置:
具有对领域模型的依赖性(即使是松散耦合的依赖性)的行为可能应该属于视图模型(或服务),而不应该属于视图。例如,如果行为需要保存到外部设备(例如数据库)或从外部设备读取,它就具有了视图不应该具有的依赖性。将此逻辑包装在服务函数中。或者如果不使用高度分层的架构,则将其放在视图模型内部。
出于与前一个答案相同的原因,该行为可能应该属于视图模型或服务类。视图不应该明确知道服务或领域模型对象,因为这会使其责任(或关注点)变得混乱。视图只应关注用户UI的可视/物理方面。许多视图应定义一个协议(即视图模型接口),以便正确地绑定到它。
这是一个有点棘手的问题。许多时候,我们预见到能够为相同内容提供不同的呈现方式。实际上,在这些情况下,视图是一种围绕某个结构的薄包装器。例如,假设对于电子邮件应用程序,我们有一个接收电子邮件的摘要视图和一个详细视图。两个视图都可能需要支持相同的行为(例如删除、回复、转发)。因为我们在同一类型的不同视图之间重用了行为,所以行为应该属于一个通用的可重用位置。视图模型逻辑是一个好的地方。
当行为需要在不同类型的视图中重复使用时(例如TextBox
,ComboBox
),我们可能需要一个附加行为。通常,我们可以知道这一点,因为视图是如此多样化,以至于它们不可能共享视图模型接口。鉴于该行为涉及与视图相关的职责,则自定义控件逻辑、代码后台、附加行为或混合行为都是合适的位置。