2011-04-15 4 views
1

実際には格納されず、他の依存関係プロパティを設定するために使用される、XAMLを介して依存関係プロパティを設定する必要がある例外的なケースがWPFにあります。これは、CoerceValueを使用して変更を傍受し、渡された値で欲しいものを行い、そのプロパティの変更を取り消すだけなので、かなり簡単です。これは、そのプロパティを取得したときに、実際の変更をブロックしてからデフォルト値を取得することを意味します。よく働く。WPFでは、DPの場合、デフォルト値を返す関数やGetter側にCoerceValueを持つ関数を使用する方法はありますか?

例として、このようなCanvasRect = "10,10,40,20" DPを内部的に設定すると、実際にはCanvas.Left、Canvas.Top、WidthおよびHeight DPが設定され、CanvasRect自体はそのままですデフォルトは "0,0,0,0"です。

しかし、私は代わりにプロパティを読み取る必要があると思っていました。他の依存プロパティに基づいてその値を再水和したいと考えました。これは簡単な1行の関数で行うことができます。

return new rect(Canvas.GetLeft(this), Canvas.GetTop(this), Width, Height); 

これは、CoerceValueのようなものですが、ゲッター側ではなく、セッターであると考えてください。しかし、私はどのように、またはたとえあなたがそのような読み返し値を強制する関数を使用することができるか分からない。

注:はい、私はこの方法がCanvasRect DPのための任意の変更通知 を無効になる知っているが、私は 注意しない、また私が実際にそのをしたいです。私がやった 、私が代わりに実際の RECTを保存したい場合は、そのプロパティに加入 で同期してそれを維持するには、Canvas.Left、Canvas.Topの イベント、 幅と高さのDP、機能的に を与えるを変更しました私は何か が欲しいですが、これは実際のDPよりも の便利なことのほうです。 これは、私が求めていることを示すための非常に簡単な例です。 現実世界の例は、 時間ベースである場合があります。DP の変更通知が問題になる場合があります。

今、私は単に私は、.NETラッパープロパティのゲッターに何を望むか実装することができますが、バインディングなどを経由して読み取る際に、.NETプロパティラッパーはMSDNをすると言う理由であるバイパスます知っています便利な委任を除いて何も使用しないでください。さらに、現実的には、OneTime以外のものについては、やはり変更通知は何も起こりません。

私が言ったように、DPセッターはうまくいきますが、私がゲッターを入れたいのであれば、関連するすべての変更通知を結びつける以外には他の方法を考えることができませんDP。

これを行う理由のもう1つの例は、プロパティゲッター自体の戻り値に値コンバーターを使用したい場合(戻り値を特定の範囲内に保ちますが、他の内部目的のための値。

ここでも基本的な質問に戻ります:DPのデフォルト値、または少なくともゲッ​​ター側のCoerceValueとして関数を使用する方法はありますか?

答えて

2

値強制は、DPの実効値の変更にのみ適用されます。 DPの値を読み取る場合は適用されません。CanvasRectの値が割り当てられた別のDP(CachedCanvasRectなど)を作成し、CanvasRectの値が変更されたときにキャッシュされたDPを更新することもできます。

+0

もし私がそれをしたら、なぜキャッシュされた値に2番目のDPを使うのでしょうか?私はCanvasRect DP自体にキャッシュされた矩形を格納するだけです。また、他のもの(他のDP、時間、何でも)は、そのキャッシュされた値を変更できるので、CanvasRectの設定者だけではありません。要するに、私はあなたがこのようにDPを使うことはできないと思います。とにかくそれのように見えません。 – MarqueIV

+1

ああスナップ - @ジョシュスミスは、WPFの質問に答えています! – dugas

+0

@MarquelV - 私はあなたの正確な要件を誤解しているに違いありません。それにもかかわらず、価値観の強制は、設定してもらうためには機能しません。 –

関連する問題