2011-07-24 31 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

是的,你钉它。我终于明白了,但谢谢。 –

相关问题