.net 如果我使用PresentationFramework';ViewModel中的枚举?

.net 如果我使用PresentationFramework';ViewModel中的枚举?,.net,design-patterns,mvvm,caliburn.micro,.net,Design Patterns,Mvvm,Caliburn.micro,简单的问题(对我来说很棘手:D) 我需要通过Caliburn.Micro的WindowManager将ViewModel中的设置参数传递到窗口 我想设置一些属性,如WindowStyle、WindowStartupLocation、ResizeMode等,但我需要PresentationFramework中包含的枚举 使用em是否打破了MVVM模式 谢谢D您可以通过将视图设置为窗口而不是用户控件,在视图的XAML中声明性地设置这些属性: <Window ... WindowStyle

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

我需要通过Caliburn.Micro的WindowManager将ViewModel中的设置参数传递到窗口

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

使用em是否打破了MVVM模式


谢谢D

您可以通过将视图设置为
窗口而不是
用户控件,在视图的XAML中声明性地设置这些属性:

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

</Window>

MVVM没有严格的规范,您的问题可以根据该规范进行评估。但是一种在开发人员中颇受欢迎的方法是创建这样的接口

public interface IWindowStateBehaviour
{
    void Maximize();
    void Minimize();
    void 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;
    }
}
…具有您期望使用的各种功能。这一个有三个用于设置窗口状态:
最大化
最小化
,以及本质上抽象和包装枚举的
正常

此接口的实现如下所示

public interface IWindowStateBehaviour
{
    void Maximize();
    void Minimize();
    void 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通过依赖项注入来接收IwindowstateBehavior的实例。它也是一种抽象,可以使VM不受任何windows特定名称空间的影响

这种方法的巨大回报是,您可以使用这样的类进行单元测试

public class FakeWindowStateBehaviour : IWindowStateBehaviour
{
    public void Maximize(){}
    public void Minimize(){}
    public void Normal() { }
}
。。。它不做任何事情,也不会因为需要演示程序集而模糊测试过程


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

您在谈论什么枚举?另一方面,通过方法传递任何枚举可能永远不会破坏MVVM。@Nalesso,你担心名称空间污染吗?@GayotFow不,你能告诉我吗?WindowManager也接受集合a设置,例如在ShowWindow方法中谢谢你的分享,这是一个很好的解决方案,尽管您的示例仅涉及MainWindow,但我认为在其中使用iWindows管理器并不困难,可能会将WM注入行为中,并为每个方法添加一个参数,您可以通过该方法提供调用的ViewModel,以便WindowManager可以检索关联的视图。或者最好传递Caliburn.Micro的IScreen接口的View属性,该接口通常由vm继承。谢谢分享!