2010-11-04 86 views
0

越来越怪异值我已经安装绑定,如下WPF转换器从绑定

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个Silders为HSL值绑定到DependencyProperties,每一个都具有PropertyChangedCallback连接到它们

new PropertyChangedCallback(HSLValuePropertyChanged) 

它看起来像

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

基本上其目的是更新绑定到控制依赖项属性Color。这个想法是get应该为属性Color运行,它从HSL属性创建一个新的颜色。看起来问题在于,即使我更改HSL值,get也不会运行。

UPDATE

于是,我就在一个异常的情况下,只需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(); 
    } 
} 
+0

你的意思是调用'color.ToString()'产生字符串'“{Name = 0,ARGB =(0,0,0,0)}''? – 2010-11-04 13:20:45

+0

@Steve Greatrex,我不确定是否会自动调用toString()?当我尝试将文本框绑定到Color而没有转换器时,我什么也没有,根本没有这样的文本,所以我想也许我需要一个转换器 – 2010-11-04 13:25:46

+0

@jiewmeng,如果你绑定到一个类型时忽略了'ToString()'调用'TextBlock',它会自动被调用。如果你在你的'Convert'方法中放置了一个断点,那么'value'是你期望的 - 一个具有正确值的'System.Windows.Media.Color'的实例?如果没有,我建议单步穿过你的Color属性获取器,看看它创建了什么 – 2010-11-04 13:28:34

回答

3

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

您应该在每个H/S/O设置新颜色(通过setvalue方法在dependencyProperty中)大号性能变化再打......

我希望我清楚:-)

+0

+1。我不认为你可以计算依赖属性附加过程中的值。您即将创建一个可以设置的依赖项属性,但其值始终取决于其他属性(因此该集合无效)。我的问题是为什么你需要这个作为一个依赖属性而不是“基本”属性? – 2010-11-04 14:19:49

+0

所以我想我应该做一些像[这个] http://pastebin.com/S3L8VAaC()来代替?它适用于寿。但我仍然不明白为什么我不能提高财产变化,这应该导致控制从“get”中获得新的颜色? – 2010-11-04 15:28:26

+1

@jiewmeng:因为get访问器永远不会从绑定中调用。相反,它将使用依赖属性的GetValue方法... – 2010-11-04 15:38:48

1

当一个DependencyProperty约束,绑定不使用属性的getter来获取值,所以,你把所有的代码在Color财产就绑定而言,getter被跳过。

坚持把你的获得者定义为get { return (XXX)GetValue(MyProperty); }并找到另一种方法。

+0

-1绑定可以使用属性获取器 - 您指的是“DependencyProperty”支持的属性,这里不适用 – 2010-11-04 13:44:09

+0

这与我所说的完全相同。 ..我同意你的看法:绑定不会使用get访问器。 – 2010-11-04 13:56:48

+0

@Steve他**是**谈论一个DependencyProperty ...看看代码:'set {SetValue(ColorProperty,value); }' – 2010-11-04 14:28:50