2013-10-16 21 views
0

如果我有以下的结合我需要一个附加属性来监控父为INotifyDataErrrorInfo

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

doesn't work,因为只有在DataContext实现INotifyDataErrorInfo,并提出“XXX.Name”错误,但ValidatesOnNotifyDataErrors试图监视XXX错误事件不是数据上下文。

但我相信有人能弄清楚如何写附加属性做以下

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

在数据上下文进行监控不是孩子。任何人有一个想法如何开始呢?

回答

1

我认为这是可能实现的,但由于绑定(的RelativeSource,MultiBindings和诸如此类的东西)的灵活性,这将是很难做出这样的事情是真正稳健的。就个人而言,我认为这将是清洁剂,以在结构的各个层次实现INotifyDataErrorInfo(和你没有自己的结构,就像你Point例子的部分,使用镜像属性代理类)。

反正Binding是一个的MarkupExtension,而不是一个DependencyObject的,这意味着附加属性不能适用于它。您可以继承Binding以添加您自己的属性,但这不是非常有用,因为它不会提供任何可覆盖的方法。

它不应该是必要扩展绑定虽然,因为所有你想要的是一个自定义ValidationRule。设置ValidatesOnNotifyDataErrors=True相当于增加一个NotifyDataErrorValidationRule

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

所以你只需要使用自己的规则来取代NotifyDataErrorValidationRule。如果重写this Validate overload(这是通过绑定表达式),你应该能够访问全部绑定路径(通过ParentBinding)和查找错误。

+0

他是用INotifyDataErrorInfo,不IDataErrorInfo的。 – Shoe

+0

@Shoe我更新了相关的参考资料。 – nmclean