2016-06-28 7 views
0

RangeSliderModelというクラスを使用して、与えられた値のセットのサイズ(幅)を記述するプロパティを使って、RangeSliderの振る舞いをモデル化したいと思います。DependencyPropertyとDataBinding - UserControlの読み込み時にプロパティセッターが呼び出されないのはなぜですか?

そして、IはDragDeltaイベントがこれらの矩形のサイズを変更し、RangeSliderModelの新しい値の計算を可能にするために使用されるいくつかの矩形の位置および大きさは、それらの性質を表すべきであるユーザーコントロール、およびThumbのいくつかのインスタンスを作成しました。最後に

、このユーザーコントロールは、タイプRangeSliderModelDependencyPropertyを持っています

public RangeSliderModel Model 
    { 
     get 
     { 
      return (RangeSliderModel)GetValue(RangeSliderModelProperty); 
      // or instead calculate a RangeSliderModel from children sizes. 
     } 
     set 
     { 
      // this IS NOT called when UserControl loads 
      SetValue(RangeSliderModelProperty, value); 
      // here I could take the value and calculate new sizes for the children. 
     } 
    } 

    public static readonly DependencyProperty RangeSliderModelProperty = 
     DependencyProperty.Register("RangeSliderModel", 
            typeof(RangeSliderModel), 
            typeof(MyUserControl), 
            new PropertyMetadata(ModelPropertyChanged)); 

    private static void ModelPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     // this IS called when UserControl loads. 
     RangeSliderModel model = e.NewValue as RangeSliderModel; 
    } 

私はSetValueGetValueプロパティをオーバーライドするために期待していたが、私はViewModelにで対応するソースには、このたDependencyPropertyをバインドする場合でも、セッター決して呼ばれない!なぜPropertyChangedHandlerが代わりに呼び出されたのか、私はこの情報で何をすればいいのか理解できません。ValueConverterに似た方法でちょうどGetValueSetValueを使用することを期待していました。

+0

ModelPropertyChangedハンドラでは、コードはRangeSliderModelとしてmyObject.Model = e.NewValueである必要があります。 – user2880486

答えて

1

バインディングを使用して依存関係のプロパティを設定しても、そのようには機能しません。 DependencyObject.SetCurrentValueは、と呼ばれます。バインディングは、(本質的に)呼んでいる:だから

yourObject.SetCurrentValue(YourClassName.RangeSliderModelProperty, someValue); 

、ええ、SetCurrentValue vs SetValueSetValueは、依存関係プロパティのバインディングを上書きします。 SetCurrentValueはできません。 IIRCでは、XAMLのスタイルトリガーで属性によって設定された値をオーバーライドすることはできません。これは、あなたがここでやっていることとは直接関係がありません。

ModelPropertyChangedハンドラは、値が変更されたときに呼び出される必要があるコードを置く場所です。依存関係プロパティと通常の.NET CLRプロパティは、2つの独立したメカニズムです。

パブリックプロパティを完全に削除した場合、XAMLに依存プロパティが正しくバインドされています。私はちょうどそれをもう一度試して、それが私のテスト例の場合であることが分かった。コメントでは、コードではこれが当てはまるとは思わなかったことを述べていますので、もっと読んでみる必要があります。あなたはサブクラスが変化に対応する必要がある場合

は、あなたは彼らがオーバーライドできる仮想メソッドを書き、ModelPropertyChangedでそれを呼び出す、または他ModelChangedイベントを書いて、ModelPropertyChangedにそれを上げることができます。

彼らはDependencyPropertyDescriptor経由ValueChangedハンドラを追加することができますが、彼らに仮想メソッドまたはイベントを書き込むことによって、どのようにグーグルのトラブルを惜しまするあなたの隣人右のだろう。

+0

いいえ、私はSetValueを通常のセッターの代わりに直接使用し始めました。一方、通常のsetter/getterを削除すると、XAMLバインディングが壊れてしまいました(私はそれが与えられたプロパティ名を期待していたと思います)。今、状況は期待どおりに働いています、ありがとう! – heltonbiker

+0

@heltonbikerうーん!それをテストし、私がナンセンスを吐き出さないようにしましょう。ありがとう! –

+0

実際には、SetValueを呼び出すのではなく、SetBindingを呼び出します。 –

関連する問題