2014-04-08 33 views
0

SystemEvents.SessionSwitch + = 新SessionSwitchEventHandler(SystemEvents_SessionSwitch);的Win32事件+ WPF + MVVM

代码即时通讯使用的用于启动和停止生成WPF应用程序,时间锁定工作站之间的时间和解锁 但我有一个很难不把在主窗口隐藏代码执行它计时器

SystemEvents.SessionSwitch += 
       new SessionSwitchEventHandler(SystemEvents_SessionSwitch); 
private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) 
     { 
      if (e.Reason == SessionSwitchReason.SessionLock) 
      { 
       //Start Timer 
      } 
      else if (e.Reason == SessionSwitchReason.SessionUnlock) 
      { 
       //Stop Timer -> show window 
      } 
     } 

的问题是,这一事件驻留在的Microsoft.Win32 - 我似乎不能在XAML中引用(如果我可以,我会迷上它以一个ICommand代替)

所以你所有的MVVM专家,我该怎么做? 我是否将它保留在主窗口代码隐藏中? 或可我实际引用的Win32在XAML

和侧面的问题... 定时器逻辑 - 我记住这单独的类和值存储在模型或? 不用说 - 我是相当新的MVVM

+1

就我个人而言,我只是在激活/关闭视图模型(取自Caliburn.Micro的术语)中挂钩和解除事件。那么就应该是没有问题的去做,在视图模型... –

+1

MVVM!=无代码隐藏。 UI逻辑进入代码隐藏。应用程序逻辑进入虚拟机。 – Will

回答

2

背后MVVM的核心主要是单位,可测试性和责任分离。这通常是通过确保视图模型没有它上面的层的知识(即“查看”),也不应直接与任何特定于平台的类(即Microsoft.Win32.SystemEvents)交互执行。

我可能会建议的一种方法是创建您自己的ISystemEvents接口,该接口只公开您希望ViewModel处理的事件。此接口的实现可以被认为是你的“模式”层的一部分,将基本上从Microsoft.Win32.SystemEvents敷所需的事件。您的应用程序将'inject'作为ViewModel初始化的一部分。

public interface ISystemEvents 
{ 
    event EventHandler<SessionSwitchEventArgs> SessionSwitch; 
} 

//Pass this implementation to your viewmodel, via the constructor 
public class MySystemEvents : ISystemEvents 
{ 
    public event EventHandler<SessionSwitchEventArgs> SessionSwitch 
    { 
     add { Microsoft.Win32.SystemEvents.SessionSwitch += value; } 
     remove { Microsoft.Win32.SystemEvents.SessionSwitch -= value; } 
    } 
} 

public class MyViewModel 
{ 
    public MyViewModel(ISystemEvents systemEvents) 
    { 
     //Store the instance of your object here, and subscribe to the desired events 
    } 
} 
+0

我以为mvvm的指导方针告诉我们模型不应该包含特定用法的知识(我猜这是 - 或者我误会了) - 虽然我喜欢你的回答,尽管:) – VisualBean

+0

虽然不太确定:( – VisualBean

+1

我添加了一个非常简短的ISystemEvents接口实现示例:MySystemEvents,我认为你在这里将“Model”与“ViewModel”混淆在一起,ViewModel应该尽可能地编程到一个接口而不是具体的Model。这可以让你的单元测试通过提供自己的“测试”模式,或在生产中使用的“真实”的车型在这个例子中,“MySystemEvents”将是量产车型 - 你可以创建一个假ISystemEvents来测试你的视图模型如何反应在开发过程中。 – BTownTKD