正确绑定IValueConverter

时间:2013-03-15 14:18:38

标签: c# wpf data-binding ivalueconverter

我正在尝试创建某种带有发光背景的标签。为此,我决定在内容控件上使用样式。发光效果来自两个DropShadowEffects,我希望将其绑定到内容控件的Foreground PropertyForeground Property的类型为BrushDropShadowEffect.Color的类型为Color,因此我需要在这两者之间进行转换。

每当我尝试通过转换器设置发光颜色时,发光效果会保持黑色。似乎转换器代码甚至都没有通过。我确实在转换器中返回了一个预定义的颜色(没有转换),甚至添加了一个Debug.Break(),但没有用。

你能告诉我我做错了什么,或者是否有更好的方法来实现具有炽热背景的标签。

转换器:

public class ColorToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return null;

        if (value is Color)
        {
            Color color = (Color)value;
            BrushConverter bc = new BrushConverter();
            return bc.ConvertFrom(color);
        }

        Type type = value.GetType();
        throw new InvalidOperationException("Unsupported type ["+type.Name+"]");            
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {

        if (value is Brush)
        {
            Brush brush = (Brush)value;
            BrushConverter bc = new BrushConverter();
            return bc.ConvertTo(brush, typeof(Color));
        }

        Type type = value.GetType();
        throw new InvalidOperationException("Unsupported type ["+type.Name+"]");            
    }
}

在资源词典中:

<local:ColorToBrushConverter x:Key="Color2BrushConverter" />

<Style x:Key="ContentControlGlowStyle" TargetType="{x:Type ContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContentControl}">
                <Border>
                    <Border.Effect>
                        <DropShadowEffect
                                BlurRadius="15"
                                Color="{Binding Path=Foreground, Converter={StaticResource Color2BrushConverter}}"
                                ShadowDepth="2"
                                Direction="0"/>

                    </Border.Effect>

                    <TextBlock Name="Highlight" Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}" Margin="10,5,0,0">
                        <TextBlock.Effect>  
                            <DropShadowEffect
                                BlurRadius="15"
                                Color="{Binding Path=Foreground,Converter={StaticResource Color2BrushConverter}}"
                                ShadowDepth="2"
                                Direction="0"/>

                        </TextBlock.Effect>

                    </TextBlock>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

并在XAML中:

<ContentControl Name="cc2" Style="{DynamicResource ContentControlGlowStyle}"
    FontSize="24"
    Foreground="LightBlue"
    Background="LightBlue"
    Content="some content to display"
    FontFamily="Verdana" />

2 个答案:

答案 0 :(得分:1)

要解决您遇到的问题,您需要将相对来源设置为颜色绑定。知道它不是转换器问题的诀窍是它永远不会被调用,VS不会吐出任何错误,这意味着已经选择了默认值。

答案 1 :(得分:1)

首先,您的转换器似乎是倒退 - 您正在将Brush转换为Color,并且您已创建ColorToBrushConverter来执行此操作。

另外,我不确定为什么要重新定义ContentControl样式的控件模板。您应该设置一个DropShadowEffect,其Color绑定到ContentControl的{​​{1}}。

请改为尝试:

Foreground

public class BrushToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var solidColorBrush = value as SolidColorBrush;
        if (solidColorBrush == null) return null;

        return solidColorBrush.Color;
    }

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

一样使用它
<local:BrushToColorConverter x:Key="BrushToColorConverter" />

<Style x:Key="ContentControlGlowStyle" TargetType="{x:Type ContentControl}">
    <Setter Property="Effect">
        <Setter.Value>
            <DropShadowEffect
                        BlurRadius="15"
                        Color="{Binding Foreground,RelativeSource={RelativeSource AncestorType=ContentControl}, Converter={StaticResource BrushToColorConverter}}"
                        ShadowDepth="2"
                        Direction="0"/>
            </Setter.Value>
       </Setter>
</Style>