2012-04-13 12 views
3

Canvasから派生したコントロールを作成しました。このコントロールは、バインディングを介してDependencyPropertyに渡された値を指定してライブダイアグラムを描画する必要があります。簡易版はこれです:私はこのようなコントロールをバインドDependencyProperties:PropertyChangedCallBackは一度だけ呼び出されます

public class Plotter : Canvas 
{ 
    public float Value { get { return (float)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(float), typeof(Plotter), 
     new PropertyMetadata(0f, new PropertyChangedCallback(ValueChangedCallBack))); 

    public static void ValueChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) 
    { 
     Plotter plotter = (Plotter)property; 
     plotter.Value = (float)args.NewValue; //<-- Removed this line to get it to work 

     // Actually draw the value into the canvas geometry 
     plotter.PlotValue(plotter.Value); 
    } 
} 

<mystuff:Plotter Value="{Binding MyViewModelProperty}" Height="50" Width="200" /> 

私のViewModelはINotifyPropertyChangedを実装し、正しくPropertyChangedを呼び出します。私がMyViewModelPropertyをテキストボックスにバインドすると、毎回正しく更新されます。私が自分のコントロールにバインドした場合にのみ、私のValueChangedCallBackは、ページがロードされると一度だけ呼び出され、その後は一度も呼び出されません。

私はここで何を見ませんか?助けてくれてありがとう!

解決済み:コールバックにValueを明示的に設定する必要はありません。

答えて

5

プロパティ値を変更するプロパティのコールバックに値を設定します。いずれにしてもそれほど意味をなさない。しかし、ローカルで設定された値がバインディング値をオーバーライドしているため、バインディングが依存関係プロパティに設定されなくなります。

+0

ああ、それは問題でした。どうもありがとう! '' Value''を明示的に設定した行を削除しました。 –

1

バインディングのモードをTwoWayに設定する必要がありますか?

+0

いいえ、OneWayバインディングにする必要があります。 ViewModelは新しい値を吐き出し、コントロールに通知してキャンバスのジオメトリにプロットする必要があります。 –

1

DependencyProperty.RegisterAttachedの代わりにDependencyProperty.Registerを使用しないでください。

+0

ああ、申し訳ありませんが、コピー&ペーストの間違いです。もともと、それは '' DependencyProperty.Register''でした。私はそれを変更しました。それは両方のバージョンで動作しません。 –

+0

Nicholas Wの答えは正しかったようです。 plotter.Value =(float)args.NewValue;を削除します。コールバックメソッドからすべてが正常になるはずです。 – calum

+0

はい、それが問題でした。ありがとう! –

関連する問題