【问题标题】:Handle nested models errors with nested IDataErrorInfo使用嵌套的 IDataErrorInfo 处理嵌套模型错误
【发布时间】:2020-01-23 13:56:53
【问题描述】:

我有一个看起来像这样的绑定:

<MyControl SomeProperty="{Binding VmProperty.SubProperty.SubSubProperty.Name, ValidatesOnDataErrors=True}" />

路上的每个班级都实现了IDataErrorInfo,但是目前,只有我的最后一个班级对名称进行了真正的检查:

public string this[string propertyName]
{
    get
    {
        if (propertyName == nameof(Name))
        {
            if(someCheck){
                return "oh oh";
            }
        }

        return string.Empty;
    }
}

public string Error{
    get{
        return this[nameof(Name)];
    }
}

现在我将值更改为不正确的值,我得到了什么:

  1. 我最后一个子模型上的this[string propertyName] 被正确调用并返回错误
  2. 我的视图模型上的this[string propertyName] 未被调用(其他级别均未调用)
  3. 控件周围不显示红色方块(如果我直接绑定到我的 VM 的本地属性,它会显示。

所以我的理解是:

  1. IDataErrorInfo 错误不会冒泡到绑定
  2. 我的视图模型的 IDataErrorInfo 实现未被调用,因为它不知道子子子子属性已更新。

你应该如何处理这个问题?无论是在子子子属性更改时通知的方式(任何级别都可以更改,因此我注册每个级别的每个PropertyChanged 事件将非常麻烦),或者冒泡错误?

【问题讨论】:

    标签: wpf xaml binding idataerrorinfo


    【解决方案1】:

    所以我的理解是: 1. IDataErrorInfo 错误不会冒泡到 Binding

    正确。

    我的视图模型的 IDataErrorInfo 实现没有被调用,因为它不知道一个 sub-sub-sub-sub-property 已被更新。

    正确。

    您应该如何处理这个问题?

    您的子视图模型需要通知父视图模型它的状态已更改,并且父视图模型需要处理此事件。

    在 .NET Framework 4.5 及更高版本中,有一个新的 INotifyDataErrorInfo 接口声明了一个可用于此目的的 ErrorsChanged 事件。 Here 是一个如何实现它的例子。

    【讨论】:

    • 有趣的是,我开始实现这个,即使它不能完全解决我的问题。我不明白的一件事:当GetErrors 用空字符串或空字符串调用时,我们不应该返回整个错误列表吗?文档说应该是实体级错误?
    • @J4N:框架为特定属性调用GetErrors,因此这应该不是问题。为什么不能正确实现这个接口来解决你的问题?
    • 如果您查看GetErrors 的文档:docs.microsoft.com/en-us/dotnet/api/… 它说The name of the property to retrieve validation errors for; or null or Empty, to retrieve entity-level errors. 我从某个容器(默认来自微软或DevExpress)收到请求GetErrors 带有null 和空
    • @J4N:那你有什么问题?
    • 当我返回所有错误时,即使是父 UserControl 也有一个红框。
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多