我們在桌面WPF世界。我們來想象下面的場景(〜用戶故事)。對話窗口MVVM方式
窗口A是用於在數據庫中添加或編輯實體A的對話框窗口。其中一個字段是對其他實體的引用。爲了方便用戶,有「添加實體B」按鈕。
當用戶按下該按鈕時,窗口乙正在顯示,其用於類似的作用 - 添加或編輯實體B.當用戶按下OK,實體正被添加到數據庫中並返回,使得它可以用於通過窗口A在某些領域自動設置它。
現在讓我們來討論技術問題。 WindowA
支持WindowAViewModel
。按下按鈕導致調用WindowAViewModel.CreateBEntity
方法。然後什麼?
- 我不能簡單地創建櫥窗內的情況下,因爲這將產生依賴從
WindowAViewModel
到WindowB
和這件事情我不想做的事。 WindowAViewModel
可以通過接口呼叫WindowA
,比如IWindowAAccess
要求新的EntityB
。然後WindowA
可以實例化WindowB
,然後接收新創建的實體並將其傳遞迴WindowAViewModel
。這將創建WindowA
和EntityB
之間的依賴關係,但我想這是可以接受的。或不?WindowAViewModel
可能會要求一些IDialogService
執行整個操作。然後執行DialogService
將創建WindowB
並執行整個操作,返回EntityB
。但是,從服務到特定視圖創建依賴關係還可以接受嗎?
解決此問題的正確方法是什麼?
編輯:Another question討論了類似的問題。然而,我有一些可能的解決方案,可能或不可能有效,我想知道它們是否可以使用(因爲在討論的問題中提出的解決方案似乎對我有點矯枉過正)。
我問真的類似這樣的問題,一個人給我用命令的相當好辦法。然後你可以使用泛型和其他東西來使它更加花哨。請參閱http://stackoverflow.com/questions/32739791/showing-a-modal-dialog-and-getting-results –
這是我不相信服務是解決MVVM對話框的好方法的原因之一問題。實際上可以單獨使用視圖模型來執行所有操作,而行爲調用創建對話框本身。你可能想看看[我在代碼項目網站上寫過的一篇長篇文章](http://www.codeproject.com/Articles/820324/Implementing-Dialog-Boxes-in-MVVM)。 –
MVVM對話框總是很有趣,你可能想看看這兩個開源項目中的實現:https://github.com/ButchersBoy/MaterialDesignInXamlToolkit和https://github.com/MahApps/MahApps.Metro –