使用IDataErrorInfo或任何类似的模式传播错误消息

时间:2010-10-26 11:50:43

标签: c# wpf mvvm idataerrorinfo

我为这个问题道歉,因为它很模糊,并且有几个问题已经整合,但由于它们密切相关,我不想将它们分成几个提交。

我目前正在考虑如何在应用程序中测试配置错误。有不同的选项,之前使用过的是IDataErrorInfo接口。我对这个实现的外观并不十分满意,不是因为它不起作用,而是因为它不完全同意实际的实现。我一直在搜索这个网站(所有52个相关问题)和其他人,看看为什么微软决定使用带有索引的关键字“this”是个好主意。它通常用于索引集合中的项目,甚至很难将我实现的类视为错误集合,我并不认为“this []”关键字应该隐式用于测试它们。 (旁注:这是否意味着自定义集合类不能有自己的配置错误?)为什么这不是像“TestErrorState(string propertyname)”这样的方法调用,甚至是索引属性?并且“字符串错误{get; “实际使用?对我来说,它看起来像一种“黑客”,并不是很容易使用。

由于这个实现,我所遇到的一个实际问题是我有与其他对象相关的对象,我希望错误状态能够传播。由于相关对象不一定显示给用户,因此用户界面中显示的类应该处于“错误状态”(除非用户单击界面上的选项并向下移动“ “对象层次结构中的一个级别”。这意味着我需要使用自己的方法扩展错误模式的测试以传播这些错误,然后我开始质疑我是否应该实现完全不同的东西,而不是去IDataErrorInfo接口。

请告诉我在哪里可以找到有关IDataErrorInfo原因的详细信息。如果你能为我提供一个很好的想法,让我知道如何通过一个对象的层次结构传播错误模式,这将是非常棒的!当我说传播时,我并不是一个例外,因为这感觉就像一个事件,只是当一个对象被要求配置错误时,它也应该询问所有孩子的错误,然后传递孩子们的错误消息。

2 个答案:

答案 0 :(得分:3)

IDataErrorInfo接口的成员通常在接口本身之外没有任何意义,因为您几乎不想以这种方式请求实体的验证错误。 IDataErrorInfo接口旨在被UI技术(如MVC和WPF)使用。

由于无需直接调用Error属性或this[string],因此IDataErrorInfo成员通常可以明确实施。这可以防止它们出现在类本身上,并允许您自己实现自己的更有用的this[]索引器。

我同意在该界面上使用索引器可能不是最好的设计,但IDataErrorInfo可能设计时还要考虑到明确的实现,所以它并不重要。

Here is an example如何明确实施IDataErrorInfo

答案 1 :(得分:1)

我不确定你是否使用MVVM,但它看起来像。我同意this[]对实施提出额外的不必要约束,而它可能是GetError(string propetyName)。我认为这是一个COM宿醉,这个界面通过COM公开,但会检查并确认。

在实践中,我从未发现此[]导致任何问题。这几乎永远不会被实现到集合,因为集合的绑定通常使用ObservableCollection,并且只有单个项目将被实现IDataErrorInfo

如果您有层次结构(例如客户和订单),则通常会为两者实施视图模型,订单视图模型将引用其父客户视图模型,以便它可以传播错误。我所拥有的场景,这种方法总能奏效。如果您遇到特定问题,请发布新问题或更新您的问题。