爲了驗證,我總是實現IDataErrorInfo
或INotifyDataErrorInfo
接口,第二個更新和(在我看來)更好。在模型或數據類型類中實現這些接口時,您可以在定義屬性的位置提供驗證權限。這對我來說很有意義,因爲它還允許使用多個屬性值執行復雜的驗證。
下面是IDataErrorInfo
的簡短示例...首先實現Item
索引方法:
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = "Enter Name";
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
的IDataErrorInfo
接口暴露了一個名爲Error
屬性此索引集時,模型類的任何有關財產被改變。我們可以Bind
此屬性中顯示錯誤消息的UI,但只有一個在使用此接口時無需定製:
<TextBlock Text="{Binding Error}" />
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
UPDATE >>>
當我想基於改變的東西是否存在在Error
屬性的錯誤消息,我添加bool
屬性到模型中的基類:
public bool HasError
{
return Error != null && Error != string.Empty;
}
然後,我只是使用此bool
屬性與BoolToWhateverConverter
...在你的情況下,你想創建一個。如果您需要幫助,請提出另一個問題,我會留意。
更新2 >>>
@Koen,你是正確的,因爲HasError
屬性反映是否有模型對象中的任何驗證錯誤。然而,有什麼可添加另一個屬性到一個特定的數據類型類阻止你:
string nameError = "Enter Name";
...
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = nameError;
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
public bool HasNameError
{
return Error == nameError;
}
這當然是最好有在模型類,這些屬性,所以您不必在每個視圖複製代碼模型類出現英寸
當設備屬性無效時,需要更改相應文本框/標籤的背景。這可能使用這些接口嗎?乍一看,我不知道如何。 – Koen
我已經有BoolToBrushConverter的工作,但我想知道如果我可以 - 使用IDataErrorInfo - 更改1文本框的顏色,無論其他證書有錯誤。此時,我爲每個屬性都有一個「IsValidPropXxxx」。看看你的更新,它是驗證完整的對象。我是否合照? – Koen
@Koen:請看鏈接,這裏將會有關於ErrorTemplate的解釋http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx – Ravuthasamy