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模式中一般不使用。