码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • WPF/C#:BusinessLayerValidation


    本文介绍了WPF/C#中的业务逻辑层验证。
    合集 - C#(53)
    1.使用C#将几个Excel文件合并去重分类2023-11-152.C#使用SqlSugar操作MySQL数据库实现简单的增删改查2023-11-163.C#中的类和继承2023-11-174.C#中的virtual和override关键字2023-11-175.C#中的属性2023-11-206.C#winform中使用SQLite数据库2023-11-237.C#简化工作之实现网页爬虫获取数据2023-11-278.C#中的委托(一)2023-11-299.C#中的ref关键字2023-11-2910.C#中out关键字2023-11-2911.C#中内置的泛型委托Func与Action2023-12-0412.在winform blazor hybrid中绘图2023-12-1313.使用C#如何监控选定文件夹中文件的变动情况?2023-12-2814.C#设计模式之策略模式01-0215.由浅入深理解C#中的事件01-0416.C#设计模式之观察者模式01-0417.C#设计模式之单例模式01-0818.C#基于ScottPlot进行可视化01-1319.C#使用MiniExcel导入导出数据到Excel/CSV文件02-1020.winform实现最小化至系统托盘02-1921.C#使用Bogus生成测试数据02-2722.SemanticKernel如何基于自有数据聊天03-0523.在winform中如何嵌入第三方软件窗体✨03-0724.在winform中如何实现双向数据绑定?03-1825.自己动手做一个批量doc转换为docx文件的小工具03-2026.WPF中动画教程(DoubleAnimation的基本使用)04-0127.WPF动画教程(PointAnimationUsingPath的使用)04-0328.C#使用PaddleOCR进行图片文字识别✨04-0929.WPF基础:在Canvas上绘制图形04-1630.WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中04-1931.使用归一化盒过滤器对图像进行平滑处理04-2032.WPF/C#:如何显示具有层级关系的数据04-2233.将彩色图转化为灰度图及其原理介绍04-2334.WPF/C#:ProgressBar的基本使用05-0835.在VB.NET项目中使用C#编写的代码05-2136.WPF/C#:理解与实现WPF中的MVVM模式05-2837.SemanticKernel:添加插件06-0638.Avalonia:一个.NET跨平台UI框架06-1039.WPF/C#:异常处理06-1240.WPF/C#:程序关闭的三种模式06-1241.wpfui:一个开源免费具有现代化设计趋势的WPF控件库06-1342.WPF/C#:如何将数据分组显示06-1743.WPF/C#:更改界面的样式06-1744.LiveCharts2:简单灵活交互式且功能强大的.NET图表库06-1845.WPF/C#:显示分组数据的两种方式06-1946.WPF/C#:在DataGrid中显示选择框06-2047.WPF/C#:数据绑定到方法06-21
    48.WPF/C#:BusinessLayerValidation06-25
    49.WPF/C#:如何实现拖拉元素06-2750.WPF在.NET9中的重大更新:Windows 11 主题07-0151.ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别07-0252.动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具07-0353.Avalonia应用在基于Linux的国产操作deepin上运行07-04
    收起

    BusinessLayerValidation介绍

    BusinessLayerValidation,即业务层验证,是指在软件应用程序的业务逻辑层(Business Layer)中执行的验证过程。业务逻辑层是应用程序架构中的一个关键部分,负责处理与业务规则和逻辑相关的操作。业务层验证的主要目的是确保数据在业务规则和逻辑上的有效性,从而维护数据的完整性和一致性。

    • 业务层验证的主要目的是确保数据在业务规则和逻辑上的有效性。这包括检查数据是否符合特定的业务规则、数据完整性检查、数据一致性检查等。
    • 通过在业务层进行验证,可以确保数据在整个应用程序中的正确性和一致性,而不仅仅是在用户界面层。

    在WPF中如何实现BusinessLayerValidation

    在WPF Samples中有一个Demo提到了BusinessLayerValidation。

    该Demo结构如下所示:

    image-20240625143242336

    实现的效果如下所示:

    当输入值是字符时会提示不是正确的形式,当输入小于0或大于150的数时会有一个自定义的提示。

    IDataErrorInfo接口

    在WPF中实现业务逻辑层的验证可以使用IDataErrorInfo接口与INotifyDataErrorInfo 接口。这个Demo使用的是IDataErrorInfo接口。IDataErrorInfo接口主要用于在数据绑定场景中提供自定义的验证错误信息。IDataErrorInfo接口包含两个成员:

    string IDataErrorInfo.Error { get; }
    

    这个属性返回一个字符串,表示整个对象的错误信息。如果对象没有错误,应该返回一个空字符串或null。

    string IDataErrorInfo.this[string columnName] { get; }
    

    这个索引器用于返回指定属性的错误信息。columnName参数表示属性的名称,索引器应该返回该属性的错误信息。如果属性没有错误,应该返回一个空字符串或null。

    通过实现IDataErrorInfo接口,可以为数据对象提供详细的验证错误信息,这些信息可以在用户界面中显示,帮助用户理解和纠正输入错误。

    定义一个实现该接口的Person类:

     public class Person : IDataErrorInfo
     {
         public int Age { get; set; }
         public string Error => null;
    
         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;
             }
         }
     }
    

    定义资源

      
    

    现在xaml中定义了一个Person对象为资源,键名为Data。

    
    
    

    为TextBox控件定义了一个键名为TextBoxInError的样式(Style)。

    触发器(Trigger)

    在WPF中,触发器(Trigger)是一种用于在特定条件满足时改变控件外观或行为的机制。Trigger通常用于Style

    或ControlTemplate中,以便在属性值变化或事件发生时自动应用视觉效果或行为。

    WPF 中的Trigger可以分为以下几类:

    • Property Trigger
    • Data Trigger
    • Event Trigger
    • MultiTrigger
    • MultiDataTrigger

    Property Trigger是最常用的触发器类型。它根据依赖属性的值来应用视觉效果或行为。

    示例:

    <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中的这些触发器,再来看看现在遇到的触发器:

     
            
                
            
    

    这是属性触发器,当Validation.HasError属性的值为true时,会将ToolTip的值设置为(Validation.Errors)[0].ErrorContent的值。

    之前我们已经接触过StaticSource这表示是静态资源,现在这里是RelativeSource,让我们来了解一下它吧。

    RelativeSource是WPF中的一个绑定标记扩展,用于指定数据绑定的源相对于绑定目标的位置。它允许你在绑定表达式中引用相对于当前控件或数据上下文的另一个对象,而不是直接指定一个固定的源对象。

    RelativeSource可以用于以下几种模式:

    • Self:绑定到控件自身的一个属性。
    • TemplatedParent:绑定到应用控件模板的控件。
    • PreviousData:在数据模板中绑定到前一个数据项。
    • FindAncestor:绑定到可视树中的祖先控件。

    可以创建更灵活和动态的数据绑定,特别是在处理复杂的用户界面和控件模板时。

    再来看文本框部分:

     
         Enter your age:
         
             
                 
                 
                     
                         
                         
                         
                     
                 
             
         
         Mouse-over to see the validation error message.
     
    

    首先为文本框设置了键名为TextBoxInError的样式。

        
     
          
                     
          
                 
      
    

    ValidatesOnExceptions属性指定了是否在数据绑定过程中捕获并处理异常。ValidatesOnExceptions="True"

    表示如果在数据绑定过程中发生了异常(例如,数据源的Age属性在设置值时抛出了异常),这个异常将会被捕获并用于验证目的,通常用于显示错误信息或阻止无效数据的输入。

      
            
      
    

    Binding.ValidationRules是一个集合属性,用于存储数据绑定的验证规则。这些验证规则用于在数据绑定过程中检查数据的合法性。DataErrorValidationRule是WPF中预定义的一种验证规则。它用于检查数据对象是否实现了

    IDataErrorInfo接口,并根据该接口提供的信息进行验证。当数据对象实现了IDataErrorInfo接口时,DataErrorValidationRule会调用接口中的方法来获取错误信息,并在数据绑定过程中应用这些错误信息。

    验证类型

    默认验证:当你输入 "a" 时,WPF尝试将 "a" 转换为整数,但由于 "a" 不是有效的整数,默认验证机制会生成一个错误,提示 "不是正确的格式"。

    自定义验证:在你输入一个有效的整数后,WPF会继续检查这个值是否符合你的自定义验证规则(例如,年龄必须在0到150之间)。如果值不符合规则,你会看到 "Age must not be less than 0 or greater than 150" 的提示。

    在WPF中,数据绑定的验证过程通常遵循以下顺序:

    数据转换(Data Conversion):

    如果绑定的数据需要从一种类型转换为另一种类型(例如,从字符串转换为整数),WPF会首先尝试进行类型转换。如果转换失败,会抛出一个异常,这个异常可以被捕获并用于验证目的。

    验证规则(Validation Rules):

    如果绑定的ValidationRules集合中定义了任何自定义的验证规则,WPF会按照这些规则的顺序依次执行它们。每个验证规则可以返回一个ValidationResult对象,指示数据是否有效以及相关的错误信息。

    异常验证(Exception Validation):

    如果绑定的ValidatesOnExceptions属性设置为True,WPF会在数据绑定的过程中捕获任何抛出的异常,并将这些异常转换为验证错误。这通常用于捕获数据转换或数据设置过程中的异常。

    IDataErrorInfo 验证:

    如果数据对象实现了IDataErrorInfo接口,WPF会调用该接口的方法来获取错误信息。DataErrorValidationRule

    可以用于在数据绑定过程中应用这些错误信息。

    INotifyDataErrorInfo 验证:

    如果数据对象实现了INotifyDataErrorInfo接口,WPF会监听该接口的事件,并在数据发生错误时获取错误信息。这种验证方式提供了更灵活和异步的验证机制。

    这些验证步骤并不是严格按顺序执行的,而是根据绑定的配置和数据对象的实现情况来决定。例如,如果绑定的

    ValidationRules集合中包含了DataErrorValidationRule,那么IDataErrorInfo验证会在验证规则执行的过程中被触发。

    WPF中的验证顺序是灵活的,并且可以根据具体的绑定配置和数据对象的实现情况来调整。通常情况下,数据转换和自定义验证规则会在异常验证和IDataErrorInfo验证之前执行。

    代码来源

    [WPF-Samples/Data Binding/BusinessLayerValidation at main · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Data Binding/BusinessLayerValidation)

  • 相关阅读:
    Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文
    聊聊我的试用期总结(不知名公司算法工程师
    PyQt5 信号(Signal)与槽(Slot)
    rtmp封包协议讲解
    js数组按照id删除
    git常用命令
    卡塔尔世界杯倒计时!世界杯直播在哪里观看?美家市场汇总来了!
    基于Minifilter框架的双缓冲透明加解密驱动 课程论文+项目源码
    微服务初识
    2020 MIT6.s081 Lab: Multithreading
  • 原文地址:https://www.cnblogs.com/mingupupu/p/18267222
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号