2011-08-29 70 views
1

我正在開發一個WPF應用程序(使用MVVM)並在我的ViewModel上實現了IDataErrorInfo。我的部分驗證檢查是必填字段已輸入。這適用於編輯現有記錄,但在添加新記錄時不提供良好的用戶體驗。只要我加載新的視圖,強制性的字段突出顯示爲無效。如何阻止IDataErrorInfo發射新物品?

有沒有一個(最好是非hacky)解決方案?這似乎是一個非常標準的事情,所以我希望我缺少一些簡單的東西。

+0

在我看來,這是正確的行爲。只要未輸入必填字段,對象就無效。 –

+0

是的,我同意它最終運作正常。然而,這並不是用戶期望的。作爲一個用戶,我甚至在做任何事情之前都會被告知我做了什麼是錯誤的。 – s1mm0t

+0

@ s1mm0t:對我來說,你是一個實現IDataErrorInfo的人。您可以確定您的實例是否仍處於初始化狀態並從此處啓動。 – Will

回答

3

使用一個標誌來指示記錄是否是新的。在IDataErrorInfo的實現中檢查此標誌,並在用戶第一次嘗試驗證輸入時將該標誌設置爲true。

+0

這似乎是我希望避免的那種哈克解決方案,但要感謝它可能是唯一的解決方案。 – s1mm0t

+0

儘管我不想使用國旗,但因爲我正在進行驗證,所以我最終被迫退出。儘管它隱藏在基礎類中,所以我想我可以忍受它:O) – s1mm0t

1

我通常在我的實體或數據類上有一個子類,它在初始化後從我的錯誤詞典中刪除所有條目。我在實例化後調用它。

您可以更進一步,併爲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詞典(這本來是私人的,但我將它設置爲好友。)在大多數情況下我會創建訪問字典的方法代替。

+0

這聽起來像比使用標誌更好的解決方案。但是,你可以確保這個初始化代碼在調用Item屬性之後運行*嗎? – s1mm0t

+0

我過去所做的是在將對象分配給ViewModel時清除字典。例如見上文。 – CodeWarrior

3

而不是使用 「ValidatesOnDataErrors =真」,你可以手動添加DataErrorValidationRule,與ValidatesOnTargetUpdated屬性:

<TextBox> 
    <TextBox.Text> 
    <Binding Path="..." ValidatesOnExceptions="true"> 
     <Binding.ValidationRules> 
      <DataErrorValidationRule ValidatesOnTargetUpdated="false"/> 
     </Binding.ValidationRules> 
    </Binding> 
    </TextBox.Text> 
</TextBox>