【问题标题】:Exception (validation) handling in WPF DataGridWPF DataGrid 中的异常(验证)处理
【发布时间】:2012-03-18 20:19:14
【问题描述】:

如果绑定引擎无法将输入的文本转换为 DataGridTextColumn 中绑定属性的数据类型(绑定如下),则该单元格会出现红色边框,并且在修复错误之前您无法编辑任何其他单元格。即使您跳出单元格,边框仍然存在。

<DataGridTextColumn Binding="{Binding IntegerProperty, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnExceptions=True}" />

在我的设置中这一切都很棒。问题是,如果我在属性设置器中抛出异常,则行为会有所不同。首先,当我从单元格中跳出时,红色边框(验证错误)立即被删除,我可以继续编辑网格的其余单元格。

有没有办法让属性设置器中抛出的异常表现得与绑定引擎处理 FormatExceptions 的方式相似?最大的烦恼是验证错误在移出单元格后被移除。

【问题讨论】:

    标签: wpf binding datagrid wpfdatagrid


    【解决方案1】:

    我认为你不应该在属性设置器中抛出异常。

    通过创建您自己的 ValidationRules 对象来控制验证。

    这可能会对您有所帮助,或者您可能会超出此范围。 http://www.wpfsharp.com/2012/02/03/how-to-disable-a-button-on-textbox-validationerrors-in-wpf/

    当异常出现在 UI 中时,甚至不会将无效值传递给绑定的属性。

    此外,您可以处理异常而不是仅仅抛出它并将属性设置为默认值或将其清除或其他方式。

    【讨论】:

    • 谢谢,ValidationRule 让我更接近解决方案。现在行为几乎相同。但是当我跳出单元格时,仍然会删除验证错误(我在包含 DataGrid 的 StackPanel 上有一个 Validation.Error 处理程序)。当绑定引擎处理 FormatException 时,这不会发生(验证错误消除)。
    【解决方案2】:

    在 setter 中抛出异常并没有错。毕竟,有些设置器在设置时会调用验证或其他过程。例如,我可能有一个数据库的 Connected 属性,该属性在设置为 true 时尝试打开数据库连接。这可以设置为我的 wpf 窗口上的切换按钮。也就是说,您可以创建一个侦听器——类似于此链接:http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors

    就我而言,我使用的是 MVVM 和 Prism/Unity 框架。一旦我检索到该值并捕获异常或引发异常,我就会在我的视图模型中调用一个名为 NotifyViewOfException 的内部事件。我传入异常对象,它通过显示一个窗口从那里处理它。您不必使用 Prism/Unity 来执行此操作。根据您的描述,我不知道您使用的是什么,所以我不会详细介绍它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多