WPF RibbonTabHeader 样式绑定到 RibbonTab 属性

WPF RibbonTabHeader style binding to RibbonTab property

我正在尝试将 RibbonTabHeader 的 属性 绑定到其相应 RibbonTab 的 属性。但是,RibbonTab 似乎不是 RibbonTabHeader 的祖先。我正在尝试绑定自定义依赖属性,但为了简单起见,我们假设这就是我想要做的:

<Style x:Key="DynamicHeader" TargetType="r:RibbonTabHeader">
                    <Setter Property="Tooltip" 
                            Value="{Binding Name, 
                            RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type r:RibbonTab}}/>

知道这个等价物会产生预期的结果,其中工具提示是 "rbnTab1":

<Style x:Key="DynamicHeader" TargetType="r:RibbonTabHeader">
                    <Setter Property="Tooltip" 
                            Value="{Binding Name, 
                            ElementName=rbnTab1}/>

如何直接在样式中重新创建此行为,以便我可以将其应用于任何所需选项卡的任何 header? 像这样:

<r:RibbonTab Name="rbnTab2" Header="Tab 2" HeaderStyle="{StaticResource DynamicHeader}">
<r:RibbonTab Name="rbnTab3" Header="Tab 3" HeaderStyle="{StaticResource DynamicHeader}">

为了结束这个话题,我最终做了以下事情:

最后,我无法从选项卡本身找到 属性 的绑定路径。相反,我没有从选项卡绑定到 属性,而是为选项卡 header 定义了一个基于原始样式的自定义样式,并且我为 [=22] 设置了 属性 =] 本身在那种风格中。为了更好地衡量,我的示例还包括我正在使用的自定义依赖项 属性(尽管我认为问题不存在,因为我使用其他自定义依赖项属性就好了):

MainWindow.xaml:

<Style x:Key="DynamicHeader" TargetType="r:RibbonTabHeader">
  <Setter Property="BorderBrush" Value="{Binding Path=(ext:Tab.TabColor), 
    RelativeSource={RelativeSource Self},
    Converter={core:StringToBrushConverter}}"/>
  [...]
</Style>

[...]

<r:RibbonTab Name="rbnTab2" Header="Tab 2">
  <r:RibbonTab.HeaderStyle>
    <Style TargetType="RibbonTabHeader" BasedOn="{StaticResource DynamicHeader}">
      <Setter Property="ext:Tab.TabColor" Value="CornflowerBlue"/>
    </Style>
  </r:RibbonTab.HeaderStyle>
</r:RibbonTab>

ControlExtensions.cs:(自定义依赖属性)

public class Tab {
  public static readonly DependencyProperty TabColorProperty =
    DependencyProperty.RegisterAttached("TabColor", typeof(string), typeof(Tab), new 
    PropertyMetadata(default(string)));

  public static void SetTabColor(UIElement element, string value) {
    element.SetValue(TabColorProperty, value);
  }

  public static string GetTabColor(UIElement element)
  {
    return (string)element.GetValue(TabColorProperty);
  }
}