我正在開發一個WPF應用程序(使用MVVM)並在我的ViewModel上實現了IDataErrorInfo。我的部分驗證檢查是必填字段已輸入。這適用於編輯現有記錄,但在添加新記錄時不提供良好的用戶體驗。只要我加載新的視圖,強制性的字段突出顯示爲無效。如何阻止IDataErrorInfo發射新物品?
有沒有一個(最好是非hacky)解決方案?這似乎是一個非常標準的事情,所以我希望我缺少一些簡單的東西。
我正在開發一個WPF應用程序(使用MVVM)並在我的ViewModel上實現了IDataErrorInfo。我的部分驗證檢查是必填字段已輸入。這適用於編輯現有記錄,但在添加新記錄時不提供良好的用戶體驗。只要我加載新的視圖,強制性的字段突出顯示爲無效。如何阻止IDataErrorInfo發射新物品?
有沒有一個(最好是非hacky)解決方案?這似乎是一個非常標準的事情,所以我希望我缺少一些簡單的東西。
我通常在我的實體或數據類上有一個子類,它在初始化後從我的錯誤詞典中刪除所有條目。我在實例化後調用它。
您可以更進一步,併爲New對象設置爲False的初始化字段(布爾值),對於現有對象設置True。
您不希望用戶出現一堆錯誤/驗證模板,僅僅是因爲它們已經生成了一個新對象並且尚未用數據填充它。
在這個例子中,我從我的ViewModel屬性。當Shipment對象被加載時,該屬性將調用錯誤字典上的Clear方法。如果貨件是來自數據庫的持久記錄,則它應具有有效數據,因爲必須對其進行驗證才能保存到數據庫。如果是新的,則條目將被刪除,用戶將看到一個新的表單準備好輸入。
Public Property ShipmentRecord() As Shipment
Get
Return _shpShipmentRecord
End Get
Set(ByVal value As Shipment)
_shpShipmentRecord = value
ShipmentRecord.m_dirtyFields.Clear()
OnPropertyChanged("ShipmentRecord")
End Set
End Property
不幸的是,這是我能找到的第一個例子,它直接訪問m_dirtyFields詞典(這本來是私人的,但我將它設置爲好友。)在大多數情況下我會創建訪問字典的方法代替。
這聽起來像比使用標誌更好的解決方案。但是,你可以確保這個初始化代碼在調用Item屬性之後運行*嗎? – s1mm0t
我過去所做的是在將對象分配給ViewModel時清除字典。例如見上文。 – CodeWarrior
而不是使用 「ValidatesOnDataErrors =真」,你可以手動添加DataErrorValidationRule,與ValidatesOnTargetUpdated屬性:
<TextBox>
<TextBox.Text>
<Binding Path="..." ValidatesOnExceptions="true">
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="false"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
在我看來,這是正確的行爲。只要未輸入必填字段,對象就無效。 –
是的,我同意它最終運作正常。然而,這並不是用戶期望的。作爲一個用戶,我甚至在做任何事情之前都會被告知我做了什麼是錯誤的。 – s1mm0t
@ s1mm0t:對我來說,你是一個實現IDataErrorInfo的人。您可以確定您的實例是否仍處於初始化狀態並從此處啓動。 – Will