MVVM模式被破坏了吗?

时间:2017-03-21 15:42:26

标签: wpf mvvm architecture

我有一个基于MVVM-Pattern的WPF应用程序。一切正常。在View-Model的业务逻辑中,我需要调用一些对话框。我已经通过接口实现了它(接口实现在View层中) 对于我需要设置父窗口的对话框,所以接口中的函数有一个参数“parentView”。

在我的ViewModel中,父窗口的类型为“object”的属性为“View”。我将此属性作为实例化对话框的参数。

由于“View”-property来自“object”类型并且是从View层设置并转发回View层,因此View-Model层与View层没有依赖关系。

你怎么看?我打破了MVVM模式吗?

2 个答案:

答案 0 :(得分:2)

  

你怎么看?我打破了MVVM模式吗?

没有。视图模型不依赖于视图,它只知道您可以在单元测试中轻松模拟的接口。因此,只要" View"" View"只是对某事的抽象。

出于类型安全的原因,您应该考虑将参数类型从object更改为强类型接口类型。

答案 1 :(得分:1)

没有朋友 - 这是一个已解决的问题。 我的意思是所有解决方案都没有真正的美,但你可以使用Dialog-Service。

一个真正简单的实现就是Singleton,它与您的Main有一个静态字段 - Window。现在,您可以从此课程中调用您的对话框。

我实际上认为MahApps就像这样,但是他们用奇特的方式注册它:

<controls:MetroWindow 
        x:Class="SomeMetroWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
        xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
        Dialog:DialogParticipation.Register="{Binding}"> <!-- watch this pls --->
<!-- ... --->
</controls:MetroWindow>

这是一般实施的example。还有另一个arcticle关于这个主题的讨论。

正如我所说 - 不是很漂亮,但已经解决了。