2011-08-10 8 views
1

ここでは非常に基本的なものがないと思います。データバインドされたプロパティを持つオブジェクトをリフレッシュする

私はそのように定義DependencyPropertyUserControl、作成しました:

public static DependencyProperty SpinnerColourProperty = DependencyProperty.Register("SpinnerColour", typeof(Color), typeof(LoadingControl), new PropertyMetadata(Colors.Black)); 

    public Color SpinnerColour 
    { 
     get 
     { 
      return (Color)GetValue(SpinnerColourProperty); 
     } 
     set 
     { 
      SetColour(value); 
      SetValue(SpinnerColourProperty, value); 
     } 
    } 

(はい、私は...英国英語を好むので、私を訴える:P)

SetColour方法を、コントロールがどのように見えるかが予想どおりに変更されます。

私のコードでは、customControl1.SpinnerColour = Colors.Redと書くと、コントロールはプロパティと視覚効果の両方のカラーをセッターで正しく変更します。 (私はVisual Studioのデザイナーでプロパティを使いこなせばこの変更を見ることもできます)

ただし、そのプロパティにデータバインディングを適用し、それがバインドされている要素を変更すると、そのプロパティの値はセッターは決して呼び出されず、実際の表示は決して変更されません。私はボタンと私のコントロールを定義する場合

だから、たとえば、:私はチェックすると次に

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     button1.Background = new SolidColorBrush(Colors.Red); 
    } 

<my:MyControl x:Name="myControl1" SpinnerColour="{Binding ElementName=button1, Path=Background.Color, Mode=TwoWay}" /> 
    <Button Content="Button" Height="23" Name="button1" Click="button1_Click" /> 

そしてClickイベントは、次のようなボタンの背景の色を変更しますSpinnerColourデバッガを使用しているプロパティは、赤色になります。しかし、私が書いたように、セッターは決して呼び出されず、実際のコントロールは決して色を変えません。

私は間違っていますか?

答えて

2

依存プロパティを誤って使用しています。
SetValueを呼び出すネイティブCLRプロパティは、コードでプロパティを設定した場合にのみ使用されます。
バインディングインフラストラクチャでは、リフレクションを使用する代わりにSetValueが直接呼び出されるため、コードは実行されません。

あなたはPropertyMetadataコンストラクタの2番目のパラメータとして、

は代わりに、あなたがたDependencyPropertyの登録にValueChangedCallbackを指定する必要がDependencyProeprtyラッパーにGetValueSetValue以外の任意のコードを入れてはいけません。

+0

私は知っています**私はいくつかの基本原則を間違っています。 >。<助けてくれてありがとう! :) – Shaamaan

関連する問題