2016-11-26 23 views
0

我仍然試圖抓住WPF和MVVM,並偶然發現問題,其中簡單的方法似乎違反了MVVM規則。如何打開模式窗口MVVM的方式

據我瞭解,在MVVM中,視圖模型不允許瞭解視圖。因此,如果我將視圖和視圖模型放入不同的程序集中,則不允許視圖模型程序集引用視圖程序集。

所以,這裏是我的問題:

  1. 比方說,我有一個的MainView和相應的MainViewModel。 MainView有一個應該關閉窗口的按鈕,並在關閉之前做一些嚴肅的事情(例如保存數據和配置)。 此按鈕綁定到MainViewModel中的CloseCommand,但我怎麼知道在MainViewModel中要關閉哪個視圖。 我的簡單(和錯誤的)方法是在初始化時給MainViewModel一個MainView的實例,或者將view-to-close作爲一個命令參數。 但這兩種解決方案都違反了MVVM規則。

  2. 假設我的MainView包含綁定到我的MainViewModel的字符串屬性的TextBox。如果文本(用戶在文本框中輸入的內容)不夠獨特,我想打開一個新的模式窗口,用戶可以從各種選項中選擇輸入。 要在WPF中打開模式窗口,必須將MainView置於新窗口的Owner屬性中。因此,您需要在MainViewModel中引用MainView。 如果嘗試顯示模態消息框(與父窗口關聯的消息框,並且無法通過鼠標單擊或其他用戶操作將其放在父窗口後面),則存在同樣的問題。

那麼,當需要關於視圖的知識時,人們應該如何在視圖模型中執行操作?

感謝您的幫助。

+0

你應該有實例爲每個'View'一個'ViewModel'實例 - 和'ViewModel'可以合法地引用'View'實例提供它抽象掉通過一些接口(例如)。 – Dai

+0

另外,你不一定要對MVVM如此教條 - 可以採取快捷方式。 MVVM的「禮物」,你可以自由地完全替換View,而不會影響系統的其他部分(例如將WPF MVVM複製+粘貼到ASP.NET MVC中)並不是真的:MVVM(具有諷刺意味的)與WPF緊密耦合。 – Dai

回答

0
  1. 看來你希望關閉主窗口,這很好。儘可能多的東西,這可以通過一個新的抽象層次來解決。假設你有一個名爲IApplication的接口,其方法爲Close()。然後讓說你有可能類似於接口的實現:

    class ApplicationWrapper : IApplication 
    { 
        public void Close() 
        { 
         Application.Current.MainWindow.Close(); 
        } 
    } 
    

    你不能注入IApplication接口視圖模型和命令調用它Close方法?

  2. 我會建議MVVM Dialogs,但我有偏見,因爲我也是作者。

相關問題