WPF RibbonTab - 无法绑定到RibbonTab Headerstyle

时间:2014-12-01 08:58:29

标签: c# wpf xaml

我尝试使用不同的颜色自定义RibbonTabHeader。 但是我无法将动态值绑定到对象RibbonTabHeader。可以通过为HeaderStyle指定样式来自定义其样式。但是从不调用绑定方法BackgroundColor的get。

的Xaml:

<Style TargetType="{x:Type ribbon:RibbonTab}">
            <Setter Property="Header" Value="{Binding Header}" />
            <Setter Property="ItemsSource" Value="{Binding GroupDataCollection}" />
            <Setter Property="Visibility" Value="{Binding IsVisible}" />
            <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
            <Setter Property="HeaderStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type ribbon:RibbonTabHeader}">
                        <Setter Property="Background" Value="{Binding BackgroundColor}"/>     
                    </Style>
                </Setter.Value>
             </Setter>
            <Setter Property="Foreground" Value="#333333" />
        </Style>

代码背后:

    public string BackgroundColor
    {
        get { return "Black";  }
    }

当我在后面的代码中动态创建样式并将其分配给HeaderStyle时,它实际上正在工作。但这似乎不是我的选择,因为我的风格会变得更加复杂(我必须删除渐变,绘制水平矩形,调整边框,......)。因此,在后面的代码中动态创建所有内容将变得复杂。 在RibbonTab中直接调用的其他绑定即IsEnabled实际上正在工作。

这段代码的作用是什么:

在Xaml中:

  <Setter Property="HeaderStyle" Value="{Binding Style}"/>

在背后的代码中:

  public Style Style
  {
        get
        {
             Style style = new Style(typeof (RibbonTabHeader));

             style.Setters.Add(new Setter(RibbonTabHeader.BackgroundProperty, Brushes.Green));
             return style;
         }
   }

如何将动态值绑定到对象RibbonTabHeader?

我在考虑在xaml中定义一个样式,然后在代码隐藏中通过LoadResource加载它。但我不确定以后是否可以克隆它以将所有不同的颜色分配给不同的标签。

1 个答案:

答案 0 :(得分:0)

经过几天的研究,我仍然没有找到问题的答案。

然而,我找到了一种解决方法,使其工作。 我最终做的是给我们一个CustomConverter来利用动态绑定的选项卡名称。

根据每个标签名称返回不同颜色的转换器如下所示:

public class TabNameToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value.ToString() = "tabName")
            return "Red";

        return "Black";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Xaml看起来像这样(内容是Tab的名称,它正在替换背景颜色)

<UserControl.Resources>
    <ResourceDictionary>
        <Converters:TabNameToColorConverter x:Key="TabNameToColorConverter" />
    </ResourceDictionary>
</UserControl.Resources>

<Style TargetType="{x:Type ribbon:RibbonTabHeader}">
            <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content,Converter={StaticResource TabNameToColorConverter}}"/>
</Style>