非常简单的 WPF 表单数据验证 - 如何进行?

2023-12-22

我有一个非常简单的课程,我们称之为“客户”。 它看起来像这样:

namespace TestValidation
{
     class Customer
     {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                if (String.IsNullOrEmpty(value))
                {
                    throw new Exception("Customer name is mandatory.");
                }
            }
        }
    }
}

现在,我创建了一个基本表单,用户可以在其中将客户添加到数据库中。该表单包含简单的文本框(绑定到 Customer 的 Name 属性)和一个“添加”按钮。

XAML代码是:

<Window x:Class="TestValidation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestValidation"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
<TextBox Margin="119,86,107,194" Name="CustomerName"
        Text="{Binding Path=Customer.Name, 
                ValidatesOnExceptions=True, 
                ValidatesOnDataErrors=True,
                UpdateSourceTrigger=PropertyChanged,
                NotifyOnValidationError=True}"
    />
        <Button Content="Add" HorizontalAlignment="Left" Margin="204,176,0,0" VerticalAlignment="Top" Width="74"/>
    </Grid>
</Window> 

从 Name 属性的设置器中,您可以了解到该名称对我来说是必需的,因此我希望如果 Name TextBox 留空,则会引发验证事件。根据 WPF 的验证规则 - 一旦用户将焦点移出文本框,并且那里没有值 - 它应该将边框颜色更改为红色。由于某种原因 - 这没有发生,我不知道为什么。我的流程出了什么问题?

现在,我已经阅读了很多关于 WPF 中的验证的好文章(例如使用 WPF 实施复杂的业务数据规则 http://msdn.microsoft.com/en-us/magazine/ff714593.aspx, WPF 中的数据验证 http://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/和 Windows Presentation Foundation 中的验证),但它们都没有帮助我解决我的问题。

最终,我希望该表格看起来像 Brian Noyes 优秀文章中第一个链接中的表格(没有 10 个学分,所以我无法附上照片......抱歉)。

如果有人能向我解释它是如何工作的,我将不胜感激。

重要说明 - 我正在使用 .Net Framework 4,因此我需要一个适合该版本的解决方案。


我绝对会推荐使用数据错误信息 http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo%28v=vs.100%29.aspx用于 WPF 验证,因为 WPF 已经了解如何使用它,并且很容易实现。

首先,将接口添加到包含要验证的数据的类中。所需的方法可能如下所示:

public class Customer : IDataErrorInfo
{
    ...

    #region IDataErrorInfo Members

    string IDataErrorInfo.Error
    {
        get { return null; }
    }

    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            if (columnName == "Name")
            {
                // Validate property and return a string if there is an error
                if (string.IsNullOrEmpty(Name))
                    return "Name is Required";
            }

            // If there's no error, null gets returned
            return null;
        }
    }
    #endregion
}

接下来,您需要设置ValidatesOnDataErrors=True在您的 TextBox 绑定中,以便每当Name属性变化:

<TextBox Text="{Binding Path=Customer.Name, ValidatesOnDataErrors=True}" ... />

最后,在 XAML 中创建一个验证模板来告诉 WPF 如何绘制验证错误。这是我通常使用的样式/模板:

<!-- ValidatingControl Style -->
<Style TargetType="{x:Type FrameworkElement}" x:Key="ValidatingControl">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="ToolTip" Value="{Binding 
                Path=(Validation.Errors)[0].ErrorContent, 
                RelativeSource={x:Static RelativeSource.Self}}" />
        </Trigger>
    </Style.Triggers>
</Style>

另外,请确保您的Customer类工具INotifyPropertyChanged因此它可以正确响应 UI 更新。我在您的代码中没有看到这一点,但为了简单起见,人们通常会忽略它:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非常简单的 WPF 表单数据验证 - 如何进行? 的相关文章

随机推荐

  • 单击鼠标右键并粘贴触发事件

    我想在文本区域中粘贴一些文本后立即在文本区域中触发一个事件 当使用 Shift Ins 时我可以做到这一点 但是 当选择鼠标右键然后粘贴 从下拉菜单中 时 我无法执行此操作 Keyup 在 Shift Ins 之后触发 单击鼠标右键后选择
  • 串口获取数据失败

    我正在使用串行端口进行锻炼 我已将此代码插入到我的程序中 我能够向设备发送数据 但无法从设备读取数据 在调试模式下 我只能得到serialport BytesToRead 0 我可以知道为什么会发生这种情况吗 while serialpor
  • 让 jQuery 等待 $.post 完成页面更新

    我正在调用一个函数来使用 jQuery post 刷新当前页面的一部分 然后在该函数完成后 我需要执行另一个函数来更新该页面上的 Google 地图 使用从 邮政 我无法嵌套这些函数 因为 DoGoogleMap 无法在 RefreshSu
  • 点与线之间最近的曼哈顿距离

    我想找到图像中绘制的线段上最小的点曼哈顿距离 http xlinux nist gov dads HTML manhattanDistance html从给定点 显而易见的方法是获取线段上的像素 并为每个像素计算距离以获得最小值 但我们能做
  • Python 是否优化循环中的函数调用?

    假设我有一段代码 它从循环中调用某个函数数百万次 并且我希望代码能够快速运行 def outer function file for line in file inner function line def inner function l
  • Fancybox:未传递数组变量

    只是似乎无法让这种情况发生 fancy click function event event preventDefault var pic room thumbnail each function index pic push http l
  • 将非标准 CSV 文件读入 R

    我正在尝试将以下 csv 文件读入 R http asic gov au Reports YTD 2015 RR20150511 001 SSDailyYTD csv http asic gov au Reports YTD 2015 RR
  • Django admin list_filter自定义字段错误

    我为用户扩展了额外的选项 例如部门 但是当我尝试在管理面板上为部门添加过滤器时 它抛出这个错误 错误 admin E116 list filter 0 的值引用的是 department 它不引用 Field 参考它的外观 https do
  • 如何从 mysql 表中删除 auto_increment

    这应该是一个非常简单的问题 但我找不到有效的解决方案 我将日期从Oracle迁移到MYSQL 在此过程中 所有主键都设置为auto increment 然而 有很多确定的关系 父级PK与子级相同 所以正确的事务处理方法是插入到父表中 得到r
  • 尝试在异步函数内使用 bcrypt 对密码进行哈希处理

    继从这个问题 https stackoverflow com questions 48799479 async function in mongoose pre save hook not working noredirect 1 comm
  • Java 8 的新 Java Date Time API 是否负责 DST?

    我正在考虑使用新的java 8 日期时间 API 我用 google 搜索了一下 发现 jodaTime 对于 java 来说是不错的选择 但仍然对这个新 API 的工作原理感兴趣 我将所有时间以 UTC 值存储在我的数据存储中 并将根据用
  • 二值图像方向

    我试图找到二值图像的方向 其中方向定义为最小惯性矩的轴 即面积的最小二阶矩 我正在使用霍恩博士关于机器人视觉的书 麻省理工学院 可以在这里找到 http people csail mit edu bkph courses papers Ro
  • 如何在java中获取所有网络接口并将信息存储在Java Map中

    我是 Java 编程新手 我需要一种方法来使用 java 获取 Linux 中的所有网络接口并将该信息存储在 Java 中Map 我在谷歌中找到了很多如何以静态方式做到这一点的方法 只是如何获得eth0并显示信息 我的代码需要可移植 代码必
  • 如何检测windows下是否安装了某个软件?

    我是编程新手 我获得了一个虚拟会议站点 现在我需要修改网站 当用户登录到会议站点时 它必须检测他的系统中是否安装了特定的软件 该软件用于进行视频通话 它使用ActiveX对象 检测系统中是否存在已安装软件的最佳方法是什么 坦白说 我什至不知
  • 从 Google 的 dataproc 读取 S3 数据

    我正在我创建的集群上通过 Google 的 dataproc 运行 pyspark 应用程序 在一个阶段 应用程序需要访问 Amazon S3 目录中的目录 在那个阶段 我收到错误 AWS 访问密钥 ID 和秘密访问密钥必须指定为 s3 U
  • PHP 中的混合引号

    我有这个脚本可以从数据库获取我的信息 result mysqli query con SELECT FROM table WHERE id 3 while row mysqli fetch array result echo p row n
  • 在xpath中为什么我可以使用大于符号>但不能使用小于符号<

    使用 c 3 编译的转换以下内容似乎工作得很好
  • 插入 int 时不支持参数

    我尝试在 SQLite3 中存储日期和时间 以便稍后使用比较来检索记录 例如SELECT WHERE date1 lt date2 我放弃了存储的尝试datetime datetime对象并决定使用 UNIX 时间戳来代替 因为它们只是一个
  • 使用命令提示符启动后台 java

    我使用以下命令运行 jetty 服务器 服务器启动 并且与服务器启动相关的消息显示在命令提示符中 java jar start jar 我想要的是 我想在后台启动jetty服务器 即服务器应该启动并且命令提示符中不应显示任何消息 因此我尝试
  • 非常简单的 WPF 表单数据验证 - 如何进行?

    我有一个非常简单的课程 我们称之为 客户 它看起来像这样 namespace TestValidation class Customer private string name public string Name get return n