Вот где логика?
вот так не работает:
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=
Validation.Errors, Converter={validators:ValidationErrorsTo
StringConverter}}"/>
а так работает:
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=
(Validation.Errors), Converter={validators:ValidationErrorsTo
StringConverter}}"/>
во втором случае Validation.Errors в скобки взято. такое чувство что и wpf в мелкософте индусы писали или я уже что то перестал понимать.
меня в школе учили. что 2+2, что (2+2) один хрен будет. если конечно ничего другого нет, а в мелкософте похоже наоборот
UPD:
<object property="(ownerType.propertyName)" .../>
The parentheses indicate that this property in a PropertyPath should be constructed using a partial qualification. It can use an XML namespace to find the type. The ownerType searches types that a XAML processor has access to, through the XmlnsDefinitionAttribute declarations in each assembly. Most applications have the default XML namespace mapped to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace, so a prefix is usually only necessary for custom types or types otherwise outside that namespace. propertyName must resolve to be the name of a property existing on the ownerType. This syntax is generally used for one of the following cases:
1) The path is specified in XAML that is in a style or template that does not have a specified Target Type. A qualified usage is generally not valid for cases other than this, because in non-style, non-template cases, the property exists on an instance, not a type.
2) The property is an attached property.
3) You are binding to a static property. In this case, ownerType really is a type.
так что всетаки все правильно