2009-06-19 14 views
0

外部ソースに依存するプロパティの場合、DependencyPropertyを作成するときに少し混乱します。例えば、私が書いている超音波アプリケーションでは、私は現在、(INotifyPropertyChangedのを実装し、ここで簡単にするためのC#に翻訳)マネージドC++ラッパーに次があります。値がローカルに格納されていないDependencyProperties

public int Gain 
{ 
    get { return ultrasound.GetParam(prmGain); } 
    set 
    { 
     ultrasound.SetParam(prmGain, value); 
     NotifyPropertyChanged("Gain"); 
    } 
} 

すべての私のコードは、WPFで使用され、私はINotifyPropertyChangedDependencyPropertyに変更する方法を検討していましたが、変更の恩恵を受けることができます。このような変数は約30種類あり、その大部分は画面上のスライダ、テキストブロック、または他のコントロールにデータバインドされています。

このオブジェクトにDependencyPropertyを実装するには、以下の点が正しいでしょうか?

public int Gain 
{ 
    get { return ultrasound.GetParam(prmGain); } 
    set 
    { 
     ultrasound.SetParam(prmGain, value); 
     this.SetValue(GainProperty, value); 
    } 
} 

public static readonly DependencyProperty GainProperty = DependencyProperty.Register(
    "Gain", typeof(int), typeof(MyUltrasoundWrapper), new PropertyMetadata(0)); 

this.GetValue(GainProperty)が使用されていない例は見たことがありません。また、値を変更する可能性のある他の関数もあります。これも正しい変更でしょうか?

public void LoadSettingsFile(string fileName) 
{ 
    // Load settings... 

    // Gain will have changed after new settings are loaded. 
    this.SetValue(GainProperty, this.Gain); 
    // Used to be NotifyPropertyChanged("Gain"); 
} 

はまた、サイドノートに、私は、プロパティのほとんどは、データバインド、またはむしろ、多くのパラメータは、データバインドされません場合は、パフォーマンスの低下している場合のパフォーマンスの向上を期待できますか?

答えて

2

GetおよびSetメソッドはthis.GetValue()およびthis.SetValue()の単純なラッパーでなければなりません。これは、WPFがゲッターまたはセッターを使用して値にアクセスしないためです常に実行される余分なコードに依存することはできません。

あなたは依存関係プロパティであることを、これらの特性が必要です場合は、確実に呼び出されますPropertyChangedイベント内で効果的にあなたultrasound.GetParam(prmGain)が発生し、ultrasound.SetParam(prmGain、値)を呼び出してキャッシュし、標準的な依存関係プロパティを作成しますどのようにプロパティが変更されても。


私が上に書いたことは、あなたが私はあなたが依存関係プロパティが何であるかを誤解することができることを考えさせる質問再読、まだ正しいですが。このC++ラッパーオブジェクトが事実上あなたのモデルであれば、INotifyPropertyChangedを使いたいと思っています。依存関係のプロパティは、バインディングを容易にし、コントロールのメモリフットプリントを下げるために、WPFコントロールによって内部的に使用されるように設計されています。それらは、データプロバイダ内で使用されることは想定されていません。つまり、通知インタフェースが使用されるものです。

+0

これは、私がthis.Gain(これはultrasound.GetParamを呼び出します)を渡す理由と、値が手動で設定されている場合の値です。私は、上記のロジックは常に最新のローカルバージョンのGainを保持すると思った。 –

+0

私はあなたが価値を得ることでうまくいくかもしれないと思います。私の心配は、その設定です。値がWPFバインディングで設定されると、Setを呼び出さないため、ultrasound.SetParam(prmGain、value);呼び出されず、超音波オブジェクト内の値は更新されません。バインディングはgetまたはsetを呼び出さず、依存関係プロパティ自体に対して直接的に作用します。 –

+0

あなたはおそらく私がそれをあまりにも多く考えているということは正しいでしょう。私はそれをINotifyPropertyChangedとして保つべきです。私は、WPFへのデータバインディングのための機能としてINotifyPropertyChangedを実装しているだけなので、DependencyPropertiesはこれを高速化できると考えていましたが、ローカル変数ではないという事実がデータを同期化するために不必要に複雑にしています。 –

関連する問題