【问题标题】:Does it break MVVM if I use PresentationFramework's enums in ViewModel?如果我在 ViewModel 中使用 PresentationFramework 的枚举,它会破坏 MVVM 吗?
【发布时间】:2013-07-04 03:56:10
【问题描述】:

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

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

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

使用 em 会破坏 MVVM 模式吗?

谢谢! :D

【问题讨论】:

  • 你在说什么枚举?另一方面,通过方法传递任何枚举可能永远不会破坏 MVVM。
  • @Nalesso,你担心命名空间污染吗?
  • @GayotFow 不,你能告诉我吗?

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


【解决方案1】:

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

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

</Window>

【讨论】:

  • WindowManager 还接受一个集合和一个设置,例如在 ShowWindow 方法中
【解决方案2】:

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,但有更好的技术可以促进抽象和“关注点分离”。

【讨论】:

  • 感谢您的分享,这是一个很好的解决方案,即使您的示例仅涵盖 MainWindow,但我认为在其中使用 IWindowManager 并不难,也许将 WM 注入行为中,并且为每个方法添加一个参数,您可以通过该参数提供调用 ViewModel,以便 WindowManager 可以检索关联的视图。或者甚至更好地传递 Caliburn.Micro 的 IScreen 接口的 View 属性,它通常是 vms 继承的。谢谢分享!
猜你喜欢
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 2011-12-04
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多