2011-07-12 100 views
5

今天我已經看了一下MSDN示例來驗證WPF文本框輸入(另請參閱:http://msdn.microsoft.com/en-us/library/ms753962.aspx)。爲什麼WPM TextBox無效時ViewModel不會更新?

在我自己的應用程序中,我使用MVVM模式將視圖的DataContext綁定到ViewModel。某些文本框綁定到ViewModel上的屬性,並在其上具有特定的驗證規則。

我發現的是當一個值失效之後,在它成功驗證之前,舊值將保留在ViewModel中。在我看來,這是非常不利的,因爲例如使用值來執行命令。

我的確切問題也適用於給定的MSDN示例。 TextBox的值只有在成功驗證後纔會發送回它的源。我想保留驗證邏輯,但它應該始終更新源代碼。這可能嗎?

在此先感謝。

+0

嘗試明確地將BindingMode設置爲TwoWay:http://msdn.microsoft.com/it-it/library/system.windows.data.bindingmode.aspx – Tigran

+1

你想要什麼直接違背機制的設計/目的。所以:不太可能。 –

+0

@Tigran,感謝您的迴應,但不幸的是,這並沒有什麼區別。 –

回答

3

正如Rachel和Henk指出的,這就是WPF驗證規則的構建方式。如果驗證失敗,它不會將值寫入屬性。

至於他們爲什麼決定以這種方式構建它,這可能是因爲他們希望在驗證失敗時採取一致的行爲。有時視圖上的值無效(例如負值Age),但可以寫入屬性中。其他時間以無法寫入屬性的方式無效(例如,「foo」的年齡不能轉換爲int)。如果行爲是「如果可能的話將價值寫入物業」,這可能會令人困惑。

和你一樣,如果我的ViewModel在可能的時候得到了更新,我會更喜歡它,而不管驗證錯誤。 Business objects are a different matter,但是「Fort Knox ViewModels」對我來說似乎很奇怪,因爲無效輸入不僅僅是OK,而是預計。通常在我的ViewModel中,我想知道「當前值」,而不是「最後有效值」。這是我不喜歡ValidationRules的原因之一。

+0

優秀點:「Fort Knox ViewModels」對我來說看起來很奇怪,因爲無效輸入不僅僅是好的,而是期望的。「 – Jay

+0

至少有人同意我的觀點!這對於確認系統有一些手動覆蓋是有用的!我會研究你的博客,聽起來很有創意。與此同時,我將剝離出ValidationRules! –

2

確認是爲了確保輸入的數據對指定的屬性有效。如果數據無效,則不應將其存儲在該屬性中。

例如,如果有人在與Integer字段綁定的TextBox中鍵入一個字母,應用程序不應該嘗試將字符放入int中,因爲會引發異常。

另一種方法是有一個單獨的IsValid()方法,對數據執行一些手動驗證檢查,並在數據有效或不有效時返回true/false。

相關問題