2013-06-28 55 views
1

我打算使用類似於this類似的東西來檢測設備何時插入。總之,它看起來像我需要重寫WndProc在哪裏把USB閃存驅動器檢測WPF,MVVM

檢測到正確的設備後,我想將設備上的文件添加到我的應用程序中。該應用程序具有類似於VS的「工作空間」結構。當設備被檢測到時,我會將ITreeView添加到我的工作區,並使用設備上的文件名填充該孩子的所有孩子。

問題是,我不確定把它放在我的WPF MVVM應用程序中的位置,因爲OnSourceInitialized必須撥打base窗口。我應該在隱藏窗口的不同線程上檢測嗎?我應該把它留在我的MainWindow代碼中嗎?任何建議表示讚賞。

回答

3

我將它留在MainWindow.xaml.cs中。如果您需要覆蓋WndProc,它無論如何都是緊密相關的,它屬於某個通常不屬於您的視圖模型或模型的「系統界面」。而且,使用代碼背後沒有任何問題。

嗯,這可能只是個人意見。

+0

+1背後的代碼沒有問題。 –

0

MVVM是Presenter模式的一般類的抽象,它通過使模型適應視圖和使用數據綁定來將視圖邏輯從視圖中分離出來。這種抽象還允許進行相當簡單的關注測試。如果您無法將視圖從模型中分離出來,或者沒有進行測試,那麼MVVM抽象並不值得維護它。您可以像後面的代碼一樣輕鬆地使用數據綁定。

鑑於這些概念,在閱讀您提到的文章後,我看不到有關枚舉USB驅動器所需的WndProcOnSourceInitialized的文章,因此我會做標準的事情並將該代碼放入您的模型並創建一個視圖建模並查看特定的綁定。

+2

枚舉no;但爲了捕獲檢測設備添加/刪除事件的'WM_DEVICECHANGE' Windows事件,我需要使用'WndProc'和'OnSourceInitialized'。除非我創建一個新線程,並不斷使用效率不高的WMI查詢。 – Kcvin

+0

呃,好的。如果你這樣說。 –

+1

對於事件,後臺工作者和任務,通常沒有理由直接在.Net中創建線程。如果您無法像本文中那樣創建活動,我會感到驚訝:http://stackoverflow.com/questions/3772337/detect-when-drive-is-mounted-or-changes-state-wm-devicechange -for-wpf –

1

此處代碼隱藏的第二票。如果代碼與UI內容嚴格相關,那麼MVVM中的代碼隱藏沒有任何問題。在這種情況下,你的模型不應該關心你在哪裏或如何加載文件,而只是它需要做什麼。恕我直言,這是嚴格意義上的問題,即您希望在安裝USB驅動器時視圖如何反應。如果是我,我會讓代碼隱藏在視圖模型或模型上調用一個方法來完成您需要的邏輯(聽起來像您所描述的viewmodel)。

0

我會從窗口開始這個過程,比如說一個計時器,然後用視圖中綁定的數據和狀態發送回ViewModel。