我在多個字段之間進行驗證時遇到了問題。例如 - 我有一個名爲RangeDateViewModel的ViewModel,它包含一個名爲DateViewModel的類的兩個實例,它們分別代表開始日期和結束日期。不同級別的多個字段之間的驗證
所以我結合這個樣子的 -
<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">
我RangeDateViewModel類實現了IDataErrorInfo的接口。 在我的計劃中,RangeDateViewModel將驗證的開始日期爲結束日期之前,由IDataErrorInfo的[「PROPERTYNAME」]功能類似這樣的應用程序的驗證邏輯 -
public string this[string columnName]
{
get
{
return ValidationError();
}
}
的問題是,這是從來沒有被調用,而是每個DateViewModel類中駐留的IDataErrorInfo屬性被調用。
我想這是因爲bound屬性不在RangeDateViewModel的同一級別,而是在子級DateViewModel內。
我認爲我的需求是相當基礎的,必須有一個簡單的解決方案來解決這個問題。 我嘗試使用ValidationRules而不是IDataErrorInfo,但然後我會讓ViewModel知道來自ValidationRules的當前驗證狀態的問題。
謝謝丹尼爾!我嘗試了你的建議,但顯然它還不夠好。 IDataErrorInfo屬性實際上是訪問,但僅在模板初始化時,而不是在實際數據更改時。我想這是因爲StartDate和EndDate是複雜的對象,它們本身並沒有被改變,但它們內部的屬性並不足以形成PropertyChanged。也許我應該在內部日期屬性更改時以某種方式提出事件? – Dror
@Dror:你說得對。請參閱已更新答案中的第三步。 –
再次感謝丹尼爾!儘管我仍然面臨着最後一個小問題,但這一切都奏效。使用此解決方案時,結果是兩個控件在數值無效時標記爲紅色。我希望不是將它們標記爲紅色,而是將包含這兩個字段的Stackpanel標記爲已讀。最好這兩個字段不會被標記,但它不是必須的。我試圖在名爲「HasErrors」的RangeDateViewModel的bool屬性上應用DataTrigger,該屬性將「Validation.HasError」設置爲true,但不幸的是它是隻讀屬性。我希望你能幫我解決這個問題。 – Dror