WPF 数据绑定异常处理

2023-11-23

我有一个绑定到 Integer 属性的文本框。当用户在文本框中输入无法转换为整数的内容(例如名称)时,将引发异常并且原始属性值不会更改。我想捕获异常,以便我可以禁用连接到该属性的命令?一般来说,如果可能的话,我该如何从定义属性的视图模型中做到这一点?


我最近遇到了同样的问题,我使用行为来解决它(但如果你不想,你不需要它们,这只是为了在不同视图中重用我需要的一些代码)。主要思想是在 ViewModel 中定义一些方法,允许视图通知 ViewModel 无法检测到的输入错误。

因此,首先在 ViewModel 中定义这些方法。为简单起见,我将仅跟踪错误数量,但您可以存储有关它们的更多信息(例如实际错误):

private int _errorCount = 0;
void AddUIValidationError()
{
   _errorCount++;
}

void RemoveUIValidationError()
{
   _errorCount--;
}

然后,在您的视图中,您注册System.Windows.Controls.Validation.ErrorEvent,这是一个路由事件,让您知道组件(之前配置为通知数据错误)何时检测到错误(例如异常验证错误):

public partial class MyView : UserControl // or whatever it is
{
    public MyView(MyViewModel viewModel)
    {
        // Possibly ensure that viewModel is not null
        InitializeComponent();
        _myViewModel = viewModel;

        this.AddHandler(System.Windows.Controls.Validation.ErrorEvent, new RoutedEventHandler(OnValidationRaised));
    }

    private MyViewModel _myViewModel;

    private void OnValidationRaised(object sender, RoutedEventArgs e)
    {
        var args = (System.Windows.Controls.ValidationErrorEventArgs)e;

        if (_myViewModel != null)
        {

            // Check if the error was caused by an exception
            if (args.Error.RuleInError is ExceptionValidationRule)
            {
                // Add or remove the error from the ViewModel
                if (args.Action == ValidationErrorEventAction.Added)
                    _myViewModel.AddUIValidationError();
                else if (args.Action == ValidationErrorEventAction.Removed)
                    _myViewModel.RemoveUIValidationError();
            }
        }
    }
}

在 Command 的 CanExecute 方法中,您将检查 ViewModel 的 _errorCount 字段是否大于 0,在这种情况下,应禁用该命令。

请注意,您必须添加ValidatesOnExceptions=True, NotifyOnValidationError=True到你的绑定,这样就可以工作了。前任:

<TextBox Text="{Binding Path=MyProperty, ValidatesOnExceptions=True, NotifyOnValidationError=True}" />

EDIT:

除了 Riley 提到的方法(这也很好,但需要将模型中的每个整数属性映射到 ViewModel 中的新字符串属性)之外,另一种方法是使用 ValidationRules。你可以加ValidationRule在解析和调用属性设置器之前检查的。例如,您可以继承 ValidationRule 并实现 Validate 方法以确保字符串可以解析为整数。 例子:

public class IntegerValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int number;
        if(Int32.TryParse((string)value, out number) == false)
            return new ValidationResult(false, "It is not a valid number");
        return new ValidationResult(true, null);
    }
}

然后,在您的视图中定义定义 IntegerValidationRule 的命名空间:

<UserControl 
...
    xmlns:rules="clr-namespace:MyApplication.ValidationRules"
...>

并在绑定中使用该规则:

<TextBox>
    <TextBox.Text>
       <Binding Path="MyProperty">
           <Binding.ValidationRules>

              <rules:IntegerValidationRule/>
           </Binding.ValidationRules>
       </Binding>
    </TextBox.Text>
</TextBox>

但无论如何,您需要为要验证的每个非字符串类型创建类,而且我认为绑定语法现在看起来有点长。

问候

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

WPF 数据绑定异常处理 的相关文章

  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当

随机推荐

  • 触摸时旋转视图

    我必须在手指触摸时循环旋转视图 我的意思是像拨打旧电话号码 并且触摸应该只在角落 任何人都可以帮助我 我已经尝试过一次很多 但没有成功 您需要定义UIRotationGestureRecognize在要旋转的视图上添加一个选择器方法并像这样
  • 默认浮点类型是什么?

    如果在变量上指定浮点类型a the abs可以使用函数 以下示例正在运行 fn main let a 1 0f64 println a abs 它打印1正如预期的那样 但如果f64省略时 编译期间会引发错误 如下例所示 fn main le
  • 如何获取自定义元素的内容

    我正在创建一个自定义元素它将能够将其内容从 Markdown 转换为 HTML 但是 我无法获取自定义元素的内容
  • 邮寄地址和格式(粗体、斜体……)

    我想用特定文本打开用户的邮件客户端 文本的某些部分应该是bold italic或 u n d e r l i n e d 我尝试使用mailto 但它使用的是RFC 2368 所以这是根本不可能的 特殊的hname body 表示关联的hv
  • requestAnimationFrame 未定义 Next.js 和 React Native Web(动画模块)

    我正在研究 Next js 和 React Native Web 我设法按照官方 Next js 示例将它们一起运行 但是当我尝试使用反应本机中的动画包时 它失败并出现错误 请求动画帧没有定义 基本上这个功能执行node modules包
  • 将对象字面量提供给 ILGenerator

    Food obj ILGenerator gen GetILGenerator gen Emit obj replace this gen Emit OpCodes Call typeof Person GetMethod Eat 显然不可
  • javascript 导入的顺序重要吗?

    我有一个 aspx 页面并导入 jQuery jTemplate 和 Flexigrid
  • Java Sound 在连接麦克风后刷新线路列表

    我有一个简单的捕获 回放 Swing 应用程序 它必须检测计算机上是否没有合适的麦克风并警告用户 经过大量摆弄后 我找到了唯一可以让我检测新连接或移除的麦克风的解决方案 com sun media sound JDK13Services s
  • 在斜线上对齐文本

    是否有可能使文本在斜线上左对齐 它的对齐方式应该遵循倾斜的倾斜图像 并需要支持 IE9 我的例子code img display block float left transform rotate 5deg margin 0 15px di
  • Rails 和 Postgresql:如何按小时对查询进行分组?

    如何在 Postgres Rails 中按小时分组 我已经阅读了相当多的答案 但我遇到了错误 这在按日期分组时有效 Model group date updated at count 然后我尝试了以下几个小时但它们不起作用 Model gr
  • JRE 1.7 漏洞

    今天 我们的企业架构师提到最近在 JRE 1 7 中发现了一个漏洞 我找到一篇文章JRE 1 7 漏洞建议禁用 Java 我在工作中运行 JDK 1 5 和 1 6 像许多组织一样 我们没有使用最新的技术 所以没有问题 我在家使用 Java
  • 我的 bin 部署的 MVC4 应用程序中的区域路由有什么问题?

    我刚刚将 MVC4 NET 4 0 应用程序部署到我的 Web 主机 以进行 实时 部署测试 非区域路线运行良好 例如我的 Html ActionLink Register as a Client Register Account new
  • 从 Spring MVC 控制器返回 xml 文件

    我已经尝试了很多从控制器函数返回文件 这是我的功能 RequestMapping value files method RequestMethod GET ResponseBody public FileSystemResource get
  • 将Python对象转换为JSON输出[重复]

    这个问题在这里已经有答案了 Python 新手 尝试定义一个非常简单的类来保存一些值 然后将其输出为 JSON 表示法 import json class Multiple def init self basis self double b
  • 通过 URI 播放通知音频

    我有通知声音的 URI 例如content media internal audio media 122 but SoundPool不适用于 URI 它仅适用于文件路径的 apk 资源 有没有办法从 URI 获取媒体文件路径 我试过Uri
  • Jquery 自动完成选择类型错误:ui.item 未定义

    我正在使用 jquery ui 1 10 3 和 jquery 2 0 3 我正在尝试使用自动完成功能来更改另一个文本框的文本 从自动完成的建议选项中选择一个选项 下面是我的自动完成功能的代码 我确实根据需要得到了结果 但是当我从中选择一个
  • 使用 IFileOperation 在复制过程中创建目录

    使用 Stephen Toub 的 C IFileOperation 包装器 link 到目前为止一直运行良好 现在我正在尝试进行复制以从网络位置收集文件 每个网络位置到其自己的子目录中 FOO data into C gather Foo
  • 如何使电话号码成为 Telegram Bot 中的链接?

    我们的团队尝试创建 Telegram 机器人 让长消息中的电话号码可点击对我们来说至关重要 有时我们必须向用户发送包含大量信息和少量电话号码的消息 因此很难拿到电话 因为电报只允许复制整个消息 如果我们发送没有任何降价的短信 telegra
  • 将 NetCDF (.nc) 转换为 GEOTIFF

    I have nc文件大小约为 300MB 包含几个数据集 TEMP DEWPOINT 预测数据 我需要转换 TEMP 数据集为多个GEOTIFF one tif对于每个时间片 以下是如何 nc文件看起来像 调查了这个answer但这似乎适
  • WPF 数据绑定异常处理

    我有一个绑定到 Integer 属性的文本框 当用户在文本框中输入无法转换为整数的内容 例如名称 时 将引发异常并且原始属性值不会更改 我想捕获异常 以便我可以禁用连接到该属性的命令 一般来说 如果可能的话 我该如何从定义属性的视图模型中做