WPF在中国没有大规模的推开,但是这并不掩饰她的魅力。最近学到了Validation,记录下。
WPF中的Validation有以下几种:
- ValidationRule
- IDataErrorInfo
- INotifyDataErrorInfo
- Custom Controls
- 等等
先说ValidationRule,首先她是个抽象函数,一般我们需要Override她的Validate方法,她有3个重载函数,无论是谁都返回ValidationResult对象。下面就我的例子详细来说明,先上个截图:
Textbox的Text属性绑定到Slider的值,当Textbox的值不在0到100之间时,会出现Textbox的边框红色,下面出现一行提示的信息,还可以设置TextBox的Tooltip值,这个不好截图。
下面是UI部分的代码:
<StackPanel>
<StackPanel.Resources>
<Style x:Key="txb" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBox x:Name="texBox" Margin="5" Style="{StaticResource txb}">
<Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged"
NotifyOnValidationError="True">
<Binding.ValidationRules>
<local:RangeValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<!-- Placeholder for the TextBox itself -->
<AdornedElementPlaceholder x:Name="textBox"/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
<Slider x:Name="slider" Minimum="-10" Maximum="100" Margin="5,20,5,5"
IsSnapToTickEnabled="True"/>
</StackPanel>
后台部分就一个ValidationRule需要记录下:
class RangeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
int index = 0;
if (int.TryParse(value.ToString(), out index))
{
if((index >= 0) && (index <= 100))
return new ValidationResult(true, null);
}
return new ValidationResult(false, string.Format("{0} is not between 0 and 100!", value));
}
}
以上关键部分已有注释,其实很简单,没试过永远很难!先记录到这里,明天记录后面的方式。
ValidationRule虽好,但是现在都是讲究MVVM,从以上代码可以看出,很显然她不适合MVVM的模式,所以在MVVM模式中一般不使用。