0

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

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

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

使用 em 会破坏 MVVM 模式吗?

谢谢!:D

4

2 回答 2

1

没有MVVM可以评估您的问题的严格规范。但是在开发人员中颇受欢迎的一种方法是创建这样的界面......

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

...具有您期望使用的各种功能。这个有三个用于设置窗口状态: MaximizeMinimize,以及Normal本质上抽象和包装一个枚举。

这个接口的实现看起来像这样......

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 或任何 DI将它们注入您的 VM 。因此,虽然直接使用 Presentation Framework 的枚举不一定会破坏MVVM,但有更好的技术可以促进抽象和“关注点分离”。

于 2014-06-06T12:48:54.723 回答
0

您可以通过使您的视图 aWindow而不是 a来在视图的 XAML 中以声明方式设置这些UserControl

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

</Window>
于 2013-07-06T16:35:18.970 回答