2011-02-26 60 views
1

因此,我有一個可編輯的ViewModel,我不想通過對話框窗口進行編輯。WPF:如何關閉按鈕單擊對話框

通常情況下,ViewModels視圖只顯示數據,但您可以通過調用window.showDialog()按下Edit按鈕打開一個新的Xaml窗口。該窗口接受viewModel作爲DataContext,將其屬性顯示爲可編輯,並將Save和Cancel命令綁定到按鈕。

這一切正常,但我有這個問題。

首先保存命令起作用,但不關閉對話框。其次,它會破壞MVVM,因爲VM必須知道EditDialog視圖來創建它。

當我點擊X關閉按鈕時會發生什麼。我知道一個對話框通常會返回false作爲DialogResult,但在這裏我不處理結果。

有沒有人做過類似的事情,但優雅地使用MVVM?

編輯

我也注意到,如果我用.ShowDialog即使我公開爲文本框,我不能編輯任何內容。這是因爲模態對話框應該如何工作?

回答

2

我看到兩種方法在這裏:

1)EditorVM不知道什麼對話框。在這種情況下,我會把這個虛擬機作爲一個簡單的編輯器來暴露屬性,但沒有SaveCommand。然後Save按鈕應該從外部注入,在某個地方打開對話框。然後在關閉對話框後,檢查是否使用Save按鈕關閉對話框,或使用Cancel按鈕關閉對話框。然後,打開對話框的代碼應該檢查返回的結果,如果對話框關閉了Save按鈕,則調用Save方法。使用這種方法,您必須使對話更加複雜一些 - 您必須從ShowDialog方法中插入SaveCancel按鈕,而不是將它們作爲要顯示的ViewModel的一部分來拉動它們。但是這種方法允許將您的EditorVM與任何特定於對話的行爲隔離開來。

2)EditorVM假設它在對話框中打開,並在Save命令處理程序中保存它的內容並關閉對話框。爲了訪問對話框的功能,我通常使用某種IWindowManager服務來處理所有打開的窗口,並且可以確定哪個對話框包含哪個viewModel並且可以相應地關閉它們。基本上這IWindowManager服務有像void CloseDialog(object ViewModel);方法。

+0

好吧,我沒有完全得到解決方案1。那麼你在哪裏打開對話框?另外我不確定我是否願意添加一個完整的IWindowManager,當我除了應用程序窗口之外只打開1個Modal。感謝您的輸入。 – 2011-02-26 13:18:25

+0

@Ingó,儘管我們也只有一個模式窗口,但我有'IWindowManager'。具有此服務的原因是將ViewModel從完全與View相關的代碼(對話框窗口)中分離出來。在第一種情況下,我會使用來自外部ViewModel的'IWindowManager'打開對話框。假設它是一些具有'EditCommand'的viewModel。這個命令應該創建'EditorViewModel'並在對話框中打開它。 – Snowbear 2011-02-26 14:01:28

+0

我正在考慮這一點,但這意味着必須在ViewModel中添加另一項服務。它是否與服務臃腫沒有問題?如果我可以讓容器處理它,這將是沒有問題的,但模型是我添加的東西之一,所以我不能做一個容器解決。 – 2011-02-26 14:06:30

相關問題