2011-07-24 30 views
2

我有一個非常簡單的用戶控件(RatingControl)已定義了依賴項屬性如下:的Windows Phone 7的Silverlight用戶控制:數據綁定不工作的自定義屬性

public partial class RatingControl : UserControl 
{ 
    public RatingControl() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty RatingValueProperty = DependencyProperty.Register("RatingValue", typeof(double), typeof(RatingControl), new PropertyMetadata(0.0)); 

    public double RatingValue 
    { 
     set 
     { 
      double normalizeValue = 0.0; 

      if (value > 10.0) 
      { 
       normalizeValue = 10.0; 
      } 
      else if (value > 0.0) 
      { 
       normalizeValue = value; 
      } 

      SetValue(RatingValueProperty, normalizeValue); 
      RenderRatingValue(); 
     } 
     get { return (double)GetValue(RatingValueProperty); } 
    } 

...

這種控制接收正確的RatingValue如果我直接給它分配:

<gtcontrols:RatingControl RatingValue="2.0" /> 

但是,如果我嘗試使用數據綁定分配給它,這是行不通的。不會調用RatingValue的「set」代碼,也不會在調試輸出窗口中看到數據綁定錯誤。 注意下面,我試圖給一個標準屬性(寬度)分配相同的值,在這種情況下,值正確地傳遞給它。

<StackPanel> 
       <TextBox Name="Test" Text="200.0" /> 

       <gtcontrols:RatingControl Width="{Binding ElementName=Test, Path=Text}" RatingValue="{Binding ElementName=Test, Path=Text}" /> 
       <TextBlock Text="{Binding ElementName=Test, Path=Text}" /> 
      </StackPanel> 

不僅TextBlock正確接收該值。另外RatingControl接收的是寬度,正確設置爲200像素;但是,RatingValue沒有設置(方法設置甚至沒有調用)

我錯過了什麼? 在此先感謝。

回答

3

事情是綁定系統不使用CLR屬性包裝器(getter和setter)來分配依賴項屬性的值。那些僅僅是爲了方便,所以你可以在你的代碼中使用這個屬性,就像普通的屬性一樣。它在內部使用SetValue()/ GetValue()方法。

因此,對於價值正常化的適當位置將是屬性更改回調依賴屬性:

public static readonly DependencyProperty RatingValueProperty = 
    DependencyProperty.Register("RatingValue", typeof(double), typeof(RatingControl), 
    new PropertyMetadata(0.0, new PropertyChangedCallback(RatingValuePropertyChanged)))); 

static void RatingValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    var ratingControl = (RatingControl)sender; 
    var val = (double)e.NewValue; 

    double normalizeValue = 0.0; 

    if (val > 10.0) 
    { 
     normalizeValue = 10.0; 
    } 
    else if (val > 0.0) 
    { 
     normalizeValue = val; 
    }  

    ratingControl.RatingValue = normalizeValue; 
} 
+0

是的,你釘它。我終於明白了,但謝謝。 –

相關問題