要事先必填驗證,首先要重寫ValidationRule類的Validate方法,然後在Binding中指定對應的ValidationRule。
第一步:重寫ValidationRule的Validate
public class RequiredValidationRule:ValidationRule {
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) {
if (value == null || string.IsNullOrWhiteSpace(value.ToString())) {
return new ValidationResult(false, "內容不能爲空");
}
return new ValidationResult(true, null);
}
}
第二步:窗體:
<TextBox Grid.Row="0" Grid.Column="1"
Validation.ErrorTemplate="{StaticResource CT_TextBox_Required}"
Style="{StaticResource Style_TextBox_Error}"
<TextBox.Text>
<Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<vr:RequiredValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
第三步:錯誤控件的樣式
<ControlTemplate x:Key="CT_TextBox_Required">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20" Text="!" />
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
<Style x:Key="Style_TextBox_Error" TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="10,5,20,5" />
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
我們來看看效果圖:,貌似不錯,但是還有不盡人意之處。在控件Focus時,控件內容爲空,我希望此時就顯示錯誤提示,而不是更改後再顯示錯誤提示,首先要添加PreviewGotKeyboardFocus事件
private void TextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
TextBox tb = sender as TextBox;
tb.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}
好,我們輕鬆地實現了必填驗證。