2013-10-16 50 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