驗證錯誤顯示
如前所述,WPF 顯示驗證錯誤的默認方式是在控件周圍繪製紅色邊框。通常需要對此方法進行自定義,以通過其他方式來顯示錯誤。而且,默認情況下不會顯示與驗證錯誤關聯的錯誤消息。常見的要求是僅當存在驗證錯誤時纔在工具提示中顯示錯誤消息。通過將 Styles 和一組與驗證關聯的附加屬性進行組合,可以相當輕鬆地自定義驗證錯誤顯示。
添加顯示錯誤文本的工具提示非常簡單。只需定義一個應用於輸入控件的 Style,每當存在驗證錯誤時,它便將該控件上的 ToolTip 屬性設置爲驗證錯誤文本。若要對此提供支持,需要使用兩個附加屬性:Validation.HasError 和 Validation.Errors。下面演示了一個針對 TextBox 類型並設置工具提示的 Style:
<Style TargetType="TextBox"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip"> <Setter.Value> <Binding Path="(Validation.Errors).CurrentItem.ErrorContent" RelativeSource="{x:Static RelativeSource.Self}" /> </Setter.Value> </Setter> </Trigger> </Style.Triggers> </Style>
您可以看到,Style 只包含 Validation.HasError 附加屬性的屬性觸發器。當 Binding 更新其源對象屬性且驗證機制生成錯誤時,HasError 屬性會設置爲 true。這種情況可能源自異常、ValidationRule 或 IDataErrorInfo 調用。該 Style 隨後使用 Validation.Errors 附加屬性,該屬性會在存在驗證錯誤時包含一個錯誤字符串集合。可以使用該集合類型的 CurrentItem 屬性來僅獲取集合中的第一個字符串。也可以設計爲將數據綁定到集合,併爲面向列表的控件中的每一項顯示 ErrorContent 屬性。
若要將控件的默認驗證錯誤顯示更改爲紅色邊框之外的內容,需要將 Validation.ErrorTemplate 附加屬性設置爲要自定義的控件上的新模板。在示例應用程序中,將在存在錯誤的每個控件右側顯示一個小的紅色漸變圓形,而不是顯示紅色邊框。爲此,可定義用作 ErrorTemplate 的控件模板。
<ControlTemplate x:Key="InputErrorTemplate"> <DockPanel> <Ellipse DockPanel.Dock="Right" Margin="2,0" ToolTip="Contains invalid data" Width="10" Height="10"> <Ellipse.Fill> <LinearGradientBrush> <GradientStop Color="#11FF1111" Offset="0" /> <GradientStop Color="#FFFF0000" Offset="1" /> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <AdornedElementPlaceholder /> </DockPanel> </ControlTemplate>
若要將該控件模板掛接到某個控件,只需設置該控件的 Validation.ErrorTemplate 屬性,您可以通過 Style 再次執行此操作:
<Style TargetType="TextBox"> <Setter Property="Validation.ErrorTemplate" Value="{StaticResource InputErrorTemplate}" /> ... </Style>
總結
在本文中,我演示瞭如何使用 WPF 數據綁定的三種驗證機制來實現一些業務數據驗證方案。您已瞭解到如何使用異常、ValidationRule 和 IDataErrorInfo 接口來實現單個屬性驗證,以及如何使用其驗證規則取決於控件上其他屬性的當前值的屬性。您還了解到如何使用 BindingGroup 來一次性評估多個 Bindings,以及如何自定義 WPF 默認方式之外的錯誤顯示。
本文的示例應用程序具有滿足某個簡單應用程序中描述的業務規則的整套驗證,該應用程序使用 MVVM 將視圖掛接到爲其提供支持的數據。