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