简单的问题(对我来说很棘手:D)
我需要通过 Caliburn.Micro 的 WindowManager 将 ViewModel 中的设置参数传递给 Window。
我想设置一些属性,如 WindowStyle、WindowStartupLocation、ResizeMode 等,但我需要 PresentationFramework 中包含的枚举。
使用 em 会破坏 MVVM 模式吗?
谢谢!:D
简单的问题(对我来说很棘手:D)
我需要通过 Caliburn.Micro 的 WindowManager 将 ViewModel 中的设置参数传递给 Window。
我想设置一些属性,如 WindowStyle、WindowStartupLocation、ResizeMode 等,但我需要 PresentationFramework 中包含的枚举。
使用 em 会破坏 MVVM 模式吗?
谢谢!:D
没有MVVM
可以评估您的问题的严格规范。但是在开发人员中颇受欢迎的一种方法是创建这样的界面......
public interface IWindowStateBehaviour
{
void Maximize();
void Minimize();
void Normal();
}
...具有您期望使用的各种功能。这个有三个用于设置窗口状态: Maximize
,Minimize
,以及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
,但有更好的技术可以促进抽象和“关注点分离”。
您可以通过使您的视图 aWindow
而不是 a来在视图的 XAML 中以声明方式设置这些UserControl
:
<Window ...
WindowStyle="None"
ResizeMode="NoResize"
...>
</Window>