2011-07-24 7 views
2

のWindows Phone 7のSilverlightユーザーコントロール:データはカスタムプロパティに取り組んでいないバインディング私はむしろ簡単なユーザーコントロール、次のように定義された依存関係プロパティを持っている(RatingControl)持って

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"コードは呼び出されず、デバッグ出力ウィンドウにデータバインディングエラーが表示されません。 以下では、標準のプロパティ(Width)に同じ値を割り当てようとしましたが、その場合は値が適切に渡されます。

<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

をうん、あなたはそれを釘付け。私は最終的にそれを理解しましたが、ありがとう。 –

関連する問題