2013-03-24 76 views
0

我是新的MVVM模式。c#MVVM演示邏輯

該視圖有一個登錄按鈕和一個進度條。

我有一個名爲LoginViewModel的視圖模型,它公開命令LoginCommand並且連接到我的視圖LoginPage.xaml。

當執行登錄命令時,應該禁用登錄按鈕,並且進度條應該可見。

如果登錄失敗,則應啓用登錄按鈕並且應隱藏進度欄。

我不確定的是這個表示邏輯應該發生的地方。它應該發生在視圖模式還是頁面後面的代碼中?

目前我在視圖模型上有一個名爲LoggingIn的布爾屬性,它在登錄過程開始時設置爲true,如果失敗則設置爲false。該布爾值分別掛鉤到按鈕和進度條的IsEnabled和Visibility屬性。

這個毛病對我來說是錯誤的,所以我試着做了一些事件,OnBeginLogin和OnEndLogin,並將它們綁定在代碼控制控件的可視狀態的頁面後面的代碼中。然而,這比以前的解決方案需要更多的代碼。

我也儘管我可以公開視圖模型中特定於控件,LoginButtonEnabled和ProgressBarVisible的兩個屬性,以便我可以從視圖模型控制視覺狀態。但是如果我添加一個取消按鈕讓說,那麼我需要添加另一個名爲CancelButtonEnabled的屬性。

我認爲不應該在視圖模型中處理表示邏輯,所以添加事件似乎是最好的解決方案,但我想知道什麼是最佳實踐或標準/常用方法?

另外,當登錄成功時,應該將用戶返回到上一頁還是另一頁?是在視圖模型還是在頁面後面的代碼中處理?再次我覺得這不是視圖模型的東西,但我不確定。

感謝您的幫助。

+0

是的,你完全正確的添加狀態另一個按鈕的新屬性。這就是爲什麼叫做ViewModel。 – Daniil 2013-03-24 21:03:22

+0

您是否嘗試過使用DataTriggers在xaml中處理演示文稿邏輯?如果您有複雜的表示邏輯,則可以使用valueconverters來處理邏輯並返回DataTrigger可以理解的值。 – failedprogramming 2013-03-25 01:25:53

回答

1

我不確定你爲什麼感覺不對,但你的第一種方法似乎是對我最正確的。視圖模型正確地將應用程序的狀態暴露給視圖,然後您使用數據綁定來控制如何轉換爲表示。

+0

我認爲這是錯誤的,因爲溝通狀態變化你通常會使用枚舉類型或事件的屬性。對於我簡單的情況布爾將會做,但如果你有一個頁面進行查看,編輯和插入將有三個枚舉值「查看」,「編輯」和「插入」,而不是IsEditing,IsInserting,但你不能使用枚舉類型在xaml中很容易,所以我認爲必須有一個處理視圖狀態變化的標準方法。 – 2013-03-25 00:53:55

+0

如果登錄成功後,視圖模型應該導航到另一個頁面還是應該在頁面後面的代碼中完成? – 2013-03-25 00:54:44

+1

我會導航到另一個用戶控件。你掛鉤你的應用程序的方式可能會有所不同。我通常只有一個MainWindow(好吧,我也有一個PopupWindow,但這是無關緊要的)。我把一個用戶控件放在我的MainWindow上,它被連接到我的MainViewModel的viewmodel屬性上。當我想「改變」屏幕時,我改變了我的MainViewModel的viewmodel屬性。我的MainWindow(或字典)上的DataTemplates檢測到視圖模型已更改,並加載了不同的usercontrol =>屏幕更改 – failedprogramming 2013-03-25 00:58:47