2014-04-08 75 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