案例地址:GitHub - microsoft/WPF-Samples: Repository for WPF related samples
一、运行界面
二、案例功能描述
绑定数据有效值;
知识点:
1、Target:设置访问键
2、<AdornedElementPlaceholder/>:在控件旁添加模板控件
3、Validation:提供支持数据验证的方法和附加属性。
4、Bingding.ValidationRules:绑定值有效规则
三、分析代码
1、Target : 设置访问键
<Label Grid.Column="0" Grid.Row="1" FontSize="15" Margin="2"
Target="{Binding ElementName=textBox1}">TextBox with _custom ErrorTemplate and ToolTip:</Label>
当按下Alt+C时,textBox1获得焦点
2、自定义错误标志控件模板
<ControlTemplate x:Key="ValidationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/> <!--- 指定该controlTemplate放在使用该controlTemplate控件的旁边--->
</DockPanel>
</ControlTemplate>
3、TextBox的Style的触发器,实现当验证数据错误时,TextBox的tooltip的值为Validation.Errors中的第一个错误。
静态类: public static class Validation,提供支持数据验证的方法和附加属性。
<Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
<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>
4、自定义绑定值有效规则,继承ValidationRule
public class AgeRangeRule : ValidationRule
{
public int Min { get; set; }
public int Max { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var age = 0;
try
{
if (((string) value).Length > 0)
age = int.Parse((string) value);
}
catch (Exception e)
{
return new ValidationResult(false, "Illegal characters or " + e.Message);
}
if ((age < Min) || (age > Max))
{
return new ValidationResult(false,
"Please enter an age in the range: " + Min + " - " + Max + ".");
}
return new ValidationResult(true, null);
}
}
5、TextBox设置附加属性Validation.ErrorTemplate、设置Style、绑定数据、确定绑定源更新的计时、设置绑定检查有效的规则
<TextBox Name="textBox1" Width="50" FontSize="15"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}"
Style="{StaticResource TextBoxInError}"
Grid.Row="1" Grid.Column="1" Margin="2">
<TextBox.Text>
<Binding Path="Age" Source="{StaticResource Ods}"
UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<local:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>