2010-11-04 142 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