问题标签 [inotifydataerrorinfo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# WPF MVVM 数据验证
我有以下 WPF-MVVM 设置:
- 具有 2 个文本字段的视图绑定到 ViewModel 的属性,UpdateSourceTrigger=PropertyChanged 和一个带有命令绑定到中继命令的按钮(CanExecute、Execute 方法)
- ViewModel 使用 [System.ComponentModel.DataAnnotations.Required] 注释的 2 个属性实现 INotifyDataErrorInfo。属性设置器调用私有的 ViladateProperty 方法,该方法将验证结果存储在错误字典中。HasErrors 属性获取器检查错误字典以返回适当的值。
目的是在整个表单正确验证后立即启用按钮。我对此的两个问题是:
- 如何在不为每个属性更改调用整个模型的验证的情况下实现按钮中继命令的 CanExecute 方法?
- 什么是“延迟” UpdateSourceTrigger 以设置相应属性的最佳方法不是在每次击键时而是在例如“无输入”一秒后?
c# - WPF 验证和 CanExecute 命令
我试图了解我最后一个问题的本质,并使描述更加清晰。
给定的是一个 WPF 表单,用于提交带有两个文本字段和一个“保存”按钮的新数据。这两个文本字段都是必填字段并绑定到 ViewModel 属性。Button 使用 Execute 和 CanExecute 方法绑定到“Execute”中继命令。CanExecute 返回 ViewModel 的 !HasErrors。ViewModel 实现 INotifyPropertyChanged 和 INotifyDataErrorInfo 接口。属性设置器仅运行此属性的验证。
目标是:
- 最初禁用“保存”按钮。
- 仅当两个文本字段均已成功验证且每次属性更改时都未验证整个 ViewModel 时才启用“保存”按钮。
对于第一个目标,我使用 isValidated bool 属性,该属性最初为假,并在第一次验证发生后立即变为真。然后在 CanExecute 方法中与 HasErros 一起检查此属性。有没有更优雅的方式?
我不知道如何实现第二个目标。对此有什么想法吗?
谢谢
c# - 使用 INotifyDataErrorInfo 和 MVVM (MVVMLight) 进行“复杂验证”
基本上问题是我想在执行 BL 之前对从数据库 (EF) 获得的一些值执行验证。我目前在 ViewModel 的属性中使用 INotifyDataErrorInfo 和属性。我尝试使用自定义验证器(CustomValidation 属性)进行此验证:
但是负责执行此验证的方法必须是静态方法,因此在这种情况下,我无法访问我的存储库,因为它不是静态的。
我该如何解决这个问题(unitService.GetAllUnitsAbbreviation() 不能是静态方法,因为它使用存储库),也许我在磨损的地方执行这种验证(错误的设计),任何帮助将不胜感激:)
c# - 在 WPF 4.5 中使用 INotifyDataErrorInfo 创建一个工具提示,显示控件的所有 Validation.Errors
我有多个控件,包括一个 TextBox 和一个 ComboBox,我希望它们都显示一个 ToolTip,其中包含 Validation.Errors 集合中包含的所有错误。如果可能的话,我希望他们都分享一个共同的风格,这就是我正在尝试的。我确信我在 ToolTip 设置器中的绑定做错了,但我不知道是什么。我在 INotifyDataErrorInfo 实现中返回一个错误对象,该对象指定错误的严重性(错误或警告)。
我想要一种适用于窗口中所有控件的样式,该样式将显示一个工具提示,其中包含该控件的所有错误和警告的列表。错误应显示为红色,警告应显示为黄色。这是我想出的风格:
我尝试更改 RelativeSource 以在 AncestorLevel 1 和 2 上搜索控制的 AncestoryType。这似乎都不起作用。
我的样式基于我用于 ErrorTemplate 的 ControlTemplate,它做的事情几乎相同:它根据错误严重性显示红色或黄色边框,并显示一个 ToolTip,就像我想为控件上的 ToolTip 做的一样本身。我确定它与我的绑定有关,因为 ErrorTemplate 自动将其 DataContext 设置为 Validation.Errors 集合,这使得为 ItmesCollection 绑定 ItemsSource 变得容易。该样式的工具提示没有这样的运气。这是我用于 ErrorTemplate 的工作 ControlTemplate:
谁能给我任何建议?
wpf - UI 未调用 INotifyDataErrorInfo.GetErrors()
我有一个模型同时实现INotifyPropertyChanged
和INotifyDataErrorInfo
的模型。当我修改了属性时,Property changed 事件就会触发,但由于某种原因,当我引发 Error 事件处理程序时,UI 确实会调用 GetErrors 方法。这会导致验证错误不会呈现到 UI。
有人可以看看我是如何设置 INotifyDataErrorInfo 并告诉我是否做错了什么吗?
基本模型实现
使用实现的模型
视图试图使用它
该应用程序是用 WPF 编写的,而 WPF 文档非常稀缺。我已经阅读了有关它的Silverlight 文档以及我在 Internet 上找到的其他一些博客文章,并以博客作者建议的每种不同方式实施。每次结果都相同时,该方法永远不会被 Binding 引擎命中。GetErrors()
谁能看到我做错了什么?当我的模型设置了它的属性时,我可以单步调试调试器并最终在OnErrorsChanged
事件处理程序中结束,并且事件被调用。但是,当它被调用时什么都没有发生,所以我很难过。
提前感谢您的帮助。
乔纳森
编辑
另外我想指出,过去几个月我一直在基类中使用 IDataErrorInfo ,没有任何问题。绑定工作,错误报告给视图,一切都很开心。当我从 IDataErrorInfo 更改为 INotifyDataErrorInfo 时,验证似乎停止与视图通信。
c# - 如何在验证另一个属性时触发对一个属性的验证,使用自定义 ValidationAttribute 和 INotifyDataErrorInfo
直到最近,我一直在使用自定义扩展版的IDataErrorInfo
界面。我的扩展使我能够同时处理多个错误,到目前为止,它对我很有帮助。但是,随着INotifyDataErrorInfo
界面的引入,我想我会尝试一下,看看是否有任何改进。
在遵循了一些在线教程之后,我得到了它ValidationAttribute
与System.ComponentModel.DataAnnotations namespace
. 使用这些Attribute
s,您可以提供如下基本验证规则:
最初,它看起来相当不错,因为错误消息直接插入到应用sValaidation.Errors
中可用的集合中。ErrorTemplate
但是,大多数内置验证规则都是非常基础的,我习惯于必须实现涉及其他属性值的复杂验证规则。
因此,我着手寻找一种方法来创建涉及多个属性的简单验证规则:必须设置两个或多个字段之一的规则。所以我声明了一个扩展的类,ValidationAttribute
在网上搜索后,找到了一种访问其他属性值的方法。
我敲开了一个基本 UI,其中ErrorTemplate
每个都应用了自定义TextBox
,它显示Validation.Errors
了数据绑定属性的集合:
使用我Attribute
对属性的自定义设置,当两个属性都未设置时Name
,我设法通过接口将 a 添加ValidationResult
到Validation.Errors
集合中,但问题是:如果我将值添加到TextBox
绑定到其他必需属性的其他 es 数据之一中,则第一个错误消息TextBox
会留在那里。
如果我回到第一个TextBox
并输入一些内容,那么验证将起作用,因此即使我删除了该值,它仍然知道设置了一个必需的属性。所以验证代码有效,但问题是对其他必需属性的属性更改不会触发属性中的验证Name
。
即使我将相同的自定义Attribute
应用于其他必需的属性,同样的事情也发生了……每个验证错误只有在输入相关的TextBox
. 我还尝试了CustomValidationAttribute
使我们能够调用类中的方法进行验证的内置方法,但最终结果是相同的。
验证代码有效,但不会从其他必需的属性更改中触发。我什至尝试调用该Validate
方法,传入其他属性的名称,但这以连续循环结束。所以问题是,当另一个属性被验证时,如何触发对一个属性的验证?
c# - INotifyDataErrorInfo 验证属性的属性
我正在开发我的 wpf 应用程序并使用 INotifyDataErrorInfo 进行验证。我有两个类(A & B),其中一个(A)有另一个(B)的两个实例。现在我想从 A 验证 B 的属性。这可能使用 INotifyDataErrorInfo 吗?
这是我的示例代码:
我觉得我在验证方法中传递了错误的属性名称。而且我无法在内部实现此验证,B
因为我需要其他B
对象的数据。我会假设这种类型的验证是可能的,因为我可以假设这是一种常见的情况,我该怎么做?
c# - 在 WPF 中使用带有嵌入式 UserControl 的 INotifyDataErrorInfo(使用 Caliburn.Micro)
我为一个相当复杂的 WPF 应用程序继承了一些代码,该应用程序使用 Caliburn.Micro 来实现 MVVM 模式。它使用自动绑定到使用 Caliburn 命名约定的视图模型的视图。视图模型继承自一个实现 INotifyDataErrorInfo 的类,并且 Fluent Validation 用于生成特定于字段的错误。这非常有效,除非在一种情况下,我将用户控件嵌入到多个不同的视图中,并且需要验证该用户控件中的 UI 元素。
嵌入式用户控件有它自己的视图模型,它不实现 INotifyDataErrorInfo。可以说,我们在验证父视图时生成的验证消息不会传播到 UI 进行显示。
我不太确定我需要在这里显示什么代码来说明问题,所以这个问题实际上更具概念性 - 问题是:
我的情况是,我应该在嵌入式用户控件后面的视图模型上实现,还是有其他方法可以在其视图模型上使用嵌套在嵌入式用户控件中的控件的属性名称来使父视图调用 GetErrors()?
我希望这是有道理的——我对 WPF 很陌生!
silverlight - 如何为 Datarow 实现 INotifyDataErrorInfo
我有一个实现的数据行类Dynamicobject and INotifyPropertyChanged and INotifyDataErrorInfo
还有一个'GridData'(datarows)
在此类中调用的属性,该属性绑定到 xaml 以在网格中显示
我可以知道如何实施public IEnumerable GetErrors(string propertyName)
正确,因为'GridData'
财产可以有很多财产袋
谢谢