Вы можете сделать это, вызвав GetBindingExpression
для соответствующего элемента, передав интересующее вас свойство зависимости. Имя будет в свойстве ResolvedSourcePropertyName
полученного выражения.
Конвертер, который вы ищете, выглядит примерно так:
public class BindingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value as FrameworkElement)?.GetBindingExpression(parameter as DependencyProperty)?.ResolvedSourcePropertyName;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
Обратите внимание, что он ожидает, что интересующий вас DP будет передан в качестве параметра команды, так что вам не нужно создайте отдельный тип конвертера для каждого из ваших различных типов привязки.
Вернувшись в свой XAML, вы просто делаете это:
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=PresentationFramework"
<Window.Resources>
<local:BindingConverter x:Key="BindingConverter" />
<Style TargetType="{x:Type TextBlock}">
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Content="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource BindingConverter}, ConverterParameter={x:Static controls:TextBlock.TextProperty}}"/>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type RadioButton}">
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Content="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=Self}, Converter={StaticResource BindingConverter}, ConverterParameter={x:Static controls:RadioButton.IsCheckedProperty}}"/>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding MyTextField}" />
<RadioButton IsChecked="{Binding MyBooleanField}" Content="Click Me" />
</StackPanel>
(Кстати, причина, по которой исходный код не работал, заключается в том, что поскольку всплывающие подсказки не являются дочерними элементами визуального дерева их «родительского» элемента управления, поэтому вместо этого необходимо выполнить привязку через PlacementTarget).