4、Custom Control 验证#p#分页标题#e# 这里我即不想污染实体类

时间:2021-08-27 09:30:24

1、ValidationRule 验证

ValidationRule:是通过ValidationRule中的的Validate要领来验证我们绑定的属性。所以我们的用法是担任ValidationRule,重写他的Validate要领。示例

public class RequiredRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { if (value == null) return new ValidationResult(false, "不能为空值!"); if (string.IsNullOrEmpty(value.ToString())) return new ValidationResult(false, "不能为空字符串!"); return new ValidationResult(true, null); } }

而XAML中需要把错误信息显示出来。

<Window.Resources> <ControlTemplate x:Key="ErrorTemplate"> <Border BorderBrush="Red" BorderThickness="1"> <AdornedElementPlaceholder/> </Border> </ControlTemplate> <Style TargetType="TextBox"> <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ErrorTemplate}"> </Setter> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger> </Style.Triggers> </Style> </Window.Resources> <StackPanel> <TextBlock Text="姓名"/> <TextBox> <TextBox.Text> <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True"> <Binding.ValidationRules> <ValidationRules:RequiredRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> <TextBlock Text="春秋"/> <TextBox > <TextBox.Text> <Binding Path="Age" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True"> <Binding.ValidationRules> <ValidationRules:GreaterThanRule Number="10"/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> </StackPanel>

这样显示的错误信息就会以 ToolTip和红色边框的形式显示出来。但这边如果又在TextBox里面设置ToolTip那么就会优先选择TextBox里的,也就是Style中的ToolTip遇到错误信息是不会显示出来的,而是显示TextBox中的ToolTip。所以我们可以改进一下显示的模版来解决这个问题。

<ControlTemplate x:Key="ErrorTemplate"> <DockPanel LastChildFill="true"> <Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10" ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"> <TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" FontWeight="Bold" Foreground="white"> </TextBlock> </Border> <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" > <Border BorderBrush="red" BorderThickness="1" /> </AdornedElementPlaceholder> </DockPanel> </ControlTemplate> 2、Exception 验证

Exception :我们xaml中绑定的东西是属性。所以Exception验证,就是通过属性的转变来判断是否正常。如:

public int Age { get { return _age; } set { if (value > 200) { throw new Exception("春秋不能大于200"); } _age = value; } }

同样跑出的异常在Xaml中也要显示下。XAML同上。这种方法就会粉碎POCO的设计原则。

3、IDataErrorInfo 验证

IDataErrorInfo:这个验证是通过我们的实体东西担任IDataErrorInfo来实现的。这里声明的this索引器来访谒类的成员。

public class BaseDataErrorInfo : IDataErrorInfo { private string _error; public string this[string columnName] { get { return GetErrorFor(columnName); } } public string Error { get { return _error; } set { _error = value; } } public virtual string GetErrorFor(string columnName) { return string.Empty; } } public class Person : BaseDataErrorInfo { public string Name { get; set; } public override string GetErrorFor(string columnName) { if (columnName == "Name") if (string.IsNullOrEmpty(Name)) return "Name 不能为空"; return base.GetErrorFor(columnName); } }

XAML同上。

4、Custom Control 验证