简单的问题(对我来说很棘手:D)
我需要将ViewModel中的设置参数通过Caliburn.Micro的WindowManager传递给Window。
我想设置一些属性,如WindowStyle,WindowStartupLocation,ResizeMode等,但我需要PresentationFramework中包含的枚举。
它是否会破坏MVVM模式以使用em?
谢谢! :d
答案 0 :(得分:1)
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将它们注入到VM中。因此,虽然直接使用Presentation Framework的枚举并不一定会破坏MVVM
,但是有更好的技术可以促进抽象和"关注点的分离"。
答案 1 :(得分:0)
您可以在视图的XAML中以声明方式设置这些视图,方法是将视图设为Window
而不是UserControl
:
<Window ...
WindowStyle="None"
ResizeMode="NoResize"
...>
</Window>