0

如果我有以下绑定

<TextBox Text="{Binding XXX.Name, ValidatesOnNotifyDataErrors=True}"/>

不起作用,因为只有 DataContext 实现 INotifyDataErrorInfo 并引发“XXX.Name”错误,但 ValidatesOnNotifyDataErrors 尝试监视XXX错误事件而不是数据上下文。

但是我相信有人可以弄清楚如何编写附加属性来执行以下操作

<TextBox Grid.Column="5" Text="{Binding Binding.Name, c:ValidatesOnNotifyDataErrorsOnDataContext=True}"/>

监控数据上下文而不是孩子的地方。有人知道如何开始吗?

4

1 回答 1

1

我认为这是可以实现的,但是由于绑定(RelativeSource、MultiBindings 等)的灵活性,很难制作出真正健壮的东西。就个人而言,我认为在结构的每个级别实现 INotifyDataErrorInfo 会更干净(并且对于您不拥有的结构部分,例如您的Point示例,使用镜像属性的代理类)。

无论如何,Binding是一个 MarkupExtension,而不是一个 DependencyObject,这意味着附加的属性不能应用于它。你可以继承Binding来添加你自己的属性,但这不是很有用,因为它没有给你任何可覆盖的方法。

不过,不必扩展 Binding ,因为您想要的只是自定义ValidationRule。设置ValidatesOnNotifyDataErrors=True等效于添加NotifyDataErrorValidationRule

<TextBox>
    <TextBox.Text>
        <Binding Path="XXX.Name">
            <Binding.ValidationRules>
                <NotifyDataErrorValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox>
</TextBox>

所以你只需要用NotifyDataErrorValidationRule你自己的规则替换。如果您覆盖此 Validate 重载(通过绑定表达式),您应该能够访问完整的绑定路径(通过 ParentBinding)并查找错误。

于 2013-10-16T13:18:07.593 回答