如果我在ViewModel中使用PresentationFramework的枚举,它会破坏MVVM吗?

时间:2013-07-06 02:43:39

标签: .net design-patterns mvvm caliburn.micro

简单的问题(对我来说很棘手:D)

我需要将ViewModel中的设置参数通过Caliburn.Micro的WindowManager传递给Window。

我想设置一些属性,如WindowStyle,WindowStartupLocation,ResizeMode等,但我需要PresentationFramework中包含的枚举。

它是否会破坏MVVM模式以使用em?

谢谢! :d

2 个答案:

答案 0 :(得分:1)

MVVM没有严格的规范可以评估您的问题。但是,开发人员喜欢的一种方法是创建一个像这样的接口 ......

public interface IWindowStateBehaviour
{
    void Maximize();
    void Minimize();
    void Normal();
}

...具有您期望使用的各种功能。这个有三个用于设置窗口状态:MaximizeMinimizeNormal基本上抽象并包装枚举。

此界面的实现如下所示......

public class WindowStateBehaviour : IWindowStateBehaviour
{
    public void Maximize()
    {
        Application.Current.MainWindow.WindowState = WindowState.Maximized;
    }
    public void Minimize()
    {
        Application.Current.MainWindow.WindowState = WindowState.Minimized;
    }
    public void Normal()
    {
        Application.Current.MainWindow.WindowState = WindowState.Normal;
    }
}

...这允许VM通过依赖注入接收IWindowStateBehaviour的实例。它也是一种抽象,可以使VM从任何特定于Windows的名称空间中清除。

这种方法的巨大回报是你可以有一个这样的类进行单元测试......

public class FakeWindowStateBehaviour : IWindowStateBehaviour
{
    public void Maximize(){}
    public void Minimize(){}
    public void Normal() { }
}

...它不做任何事情,并且不会通过要求演示文稿组件来模糊测试过程。

您可以对启动位置,调整大小模式和其他参数使用类似的技术,并使用Unity或您正在使用的任何DI将它们注入到VM中。因此,虽然直接使用Presentation Framework的枚举并不一定会破坏MVVM,但是有更好的技术可以促进抽象和"关注点的分离"。

答案 1 :(得分:0)

您可以在视图的XAML中以声明方式设置这些视图,方法是将视图设为Window而不是UserControl

<Window ... 
  WindowStyle="None"
  ResizeMode="NoResize"
  ...>

</Window>