WPF转换器从Binding获得奇怪的值

时间:2010-11-04 13:13:20

标签: c# wpf ivalueconverter

我的设置绑定如下

XAML

 <TextBlock Text="{Binding Path=Color, Converter={StaticResource ColorToStringConverter}}" />

C#:显示Color

public System.Windows.Media.Color Color
{
    get
    {
        var color = new HSLColor { Hue = this.Hue, Saturation = this.Saturation, Luminosity = this.Luminosity };
        string strColor = color.ToRGBString();
        return new System.Windows.Media.Color { 
            R = byte.Parse(strColor.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
            G = byte.Parse(strColor.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
            B = byte.Parse(strColor.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)
        };
    }
    set { SetValue(ColorProperty, value); }
}

转换器

public class ColorToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Color color = (Color)value;
        return color.ToString();
    }
}

但我的转换器正在获得value

value = "{Name=0, ARGB=(0, 0, 0, 0)}"

我希望它是System.Windows.Media.Color为什么我会得到这个?

基本上,我有3个Silder,HSL值绑定到DependencyProperties,每个都附加PropertyChangedCallback

new PropertyChangedCallback(HSLValuePropertyChanged)

看起来像是

protected void HSLValueChanged()
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs("Color"));
}

基本上它的目的是更新绑定到依赖项属性Color的控件。我们的想法是get应该为属性Color运行,它会从HSL属性创建一个新颜色。似乎问题是即使我更改HSL值,get也不会运行。

更新

所以我尝试在异常的情况下只返回value,我在文本框中什么都没有,所以我value.toString()一直得到Color [Empty]。我做错了什么?

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    try
    {
        Color color = (Color)value;
        return color.ToString();
    } catch (Exception) {
        return value.ToString();
    }
}

2 个答案:

答案 0 :(得分:3)

您似乎正在使用ColorDependencyProperty。 如果是这样,我认为绑定可能永远不会通过访问器(获取/设置)......

您应该在每个H / S / L属性更改回调中设置新颜色(通过setvalue方法在dependencyProperty中)...

我希望我很清楚: - )

答案 1 :(得分:1)

当绑定在DependencyProperty上时,绑定不会使用属性getter来获取值,因此,就绑定而言,所有放在Color属性getter中的代码都会被跳过。

坚持将你的吸气剂定义为get { return (XXX)GetValue(MyProperty); }并找到另一种方法。