2.通过在业务层进行验证,可以确保数据在整个应用程序中的正确性和一致性,而不仅仅是在用户界面层。
在WPF中如何实现BusinessLayerValidation
在WPF Samples中有一个Demo提到了BusinessLayerValidation。该Demo结构如下所示:string IDataErrorInfo.Error { get; }这个属性返回一个字符串,表示整个对象的错误信息。如果对象没有错误,应该返回一个空字符串或null。
string IDataErrorInfo.this[string columnName] { get; }这个索引器用于返回指定属性的错误信息。columnName参数表示属性的名称,索引器应该返回该属性的错误信息。如果属性没有错误,应该返回一个空字符串或null。通过实现IDataErrorInfo接口,可以为数据对象提供详细的验证错误信息,这些信息可以在用户界面中显示,帮助用户理解和纠正输入错误。
public class Person : IDataErrorInfo { public int Age { get; set; } public string Error => null; // 堆代码 duidaima.com public string this[string name] { get { string result = null; if (name == "Age") { if (Age < 0 || Age > 150) { result = "Age must not be less than 0 or greater than 150."; } } return result; } } }定义资源
<local:Person x:Key="Data"/>现在xaml中定义了一个Person对象为资源,键名为Data。
<!--The tool tip for the TextBox to display the validation error message.--> <Style x:Key="TextBoxInError" TargetType="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>为TextBox控件定义了一个键名为TextBoxInError的样式(Style)。
5.MultiDataTrigger
<Style TargetType="Button"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Yellow"/> </Trigger> </Style.Triggers> </Style>在这个例子中,当鼠标悬停在按钮上时,按钮的背景色会变为黄色。Data Trigger类似于Property Trigger,但它用于绑定数据上下文中的属性,而不是控件本身的依赖属性。
<Style TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsEnabled}" Value="False"> <Setter Property="Foreground" Value="Gray"/> </DataTrigger> </Style.Triggers> </Style>在这个例子中,当数据上下文中的IsEnabled属性为False时,文本块的前景色会变为灰色。Event Trigger用于在特定事件发生时执行动画或命令。
<Button Content="Click Me"> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:1"/> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button>在这个例子中,当按钮被点击时,按钮的透明度会从 1 变为 0,持续 1 秒钟。MultiTrigger和MultiDataTrigger允许你指定多个条件,只有当所有条件都满足时,才会应用视觉效果或行为。
<Style TargetType="TextBox"> <Style.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsFocused" Value="True"/> <Condition Property="Text" Value=""/> </MultiTrigger.Conditions> <Setter Property="BorderBrush" Value="Red"/> </MultiTrigger> </Style.Triggers> </Style>在这个例子中,当文本框获得焦点且文本为空时,文本框的边框颜色会变为红色。通过使用这些触发器,可以创建动态和响应式的用户界面,根据不同的条件自动调整控件的外观和行为。通过回顾WPF中的这些触发器,再来看看现在遇到的触发器:
<Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger>这是属性触发器,当Validation.HasError属性的值为true时,会将ToolTip的值设置为(Validation.Errors)[0].ErrorContent的值。之前我们已经接触过StaticSource这表示是静态资源,现在这里是RelativeSource,让我们来了解一下它吧。RelativeSource是WPF中的一个绑定标记扩展,用于指定数据绑定的源相对于绑定目标的位置。它允许你在绑定表达式中引用相对于当前控件或数据上下文的另一个对象,而不是直接指定一个固定的源对象。
<StackPanel Margin="20"> <TextBlock>Enter your age:</TextBlock> <TextBox Style="{StaticResource TextBoxInError}"> <TextBox.Text> <!--By setting ValidatesOnExceptions to True, it checks for exceptions that are thrown during the update of the source property. An alternative syntax is to add <ExceptionValidationRule/> within the <Binding.ValidationRules> section.--> <Binding Path="Age" Source="{StaticResource Data}" ValidatesOnExceptions="True" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <!--DataErrorValidationRule checks for validation errors raised by the IDataErrorInfo object.--> <!--Alternatively, you can set ValidationOnDataErrors="True" on the Binding.--> <DataErrorValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> <TextBlock>Mouse-over to see the validation error message.</TextBlock> </StackPanel>首先为文本框设置了键名为TextBoxInError的样式。
<TextBox.Text> <Binding Path="Age" Source="{StaticResource Data}" ValidatesOnExceptions="True" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <DataErrorValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text>ValidatesOnExceptions属性指定了是否在数据绑定过程中捕获并处理异常。ValidatesOnExceptions="True" 。表示如果在数据绑定过程中发生了异常(例如,数据源的Age属性在设置值时抛出了异常),这个异常将会被捕获并用于验证目的,通常用于显示错误信息或阻止无效数据的输入。
<Binding.ValidationRules> <DataErrorValidationRule/> </Binding.ValidationRules>Binding.ValidationRules是一个集合属性,用于存储数据绑定的验证规则。这些验证规则用于在数据绑定过程中检查数据的合法性。DataErrorValidationRule是WPF中预定义的一种验证规则。它用于检查数据对象是否实现了IDataErrorInfo接口,并根据该接口提供的信息进行验证。当数据对象实现了IDataErrorInfo接口时,DataErrorValidationRule会调用接口中的方法来获取错误信息,并在数据绑定过程中应用这些错误信息。