2010-11-20 41 views
42

私がこれを求めているのは、@ Greg D(this question)の代わりにSetCurrentValue()を使用することが推奨されているからです。その違いは何ですか?あるいは、「価値源を変えない」という意味はどういう意味ですか?依存性プロパティSetValue()とSetCurrentValue()の相違点

SetValue()

その依存関係プロパティ識別子によって指定され、依存関係プロパティのローカル値を設定します。

SetCurrentValue()

その値のソースを変更せずに依存関係プロパティの値を設定します。

答えて

46

あなたが提供するMSDNのリンクは非常によくそれを言う:

このメソッドは無効 せずに、プログラムで値独自のプロパティの1の を設定し、コンポーネント で使用されているアプリケーションのはの 使用することを宣言しましたプロパティ。 SetCurrentValueメソッドは、 プロパティの実効値を変更しますが、 既存のトリガー、データバインド、および スタイルは引き続き機能します。

あなたが TextBoxコントロールを書いていると仮定して、以下のように、あなたは、人々が頻繁に使用 Textプロパティを公開しました:あなたのコントロールのコードで

<TextBox Text="{Binding SomeProperty}"/> 

はあなたがを上書きしますSetValue呼び出す場合、あなたが提供するものとの拘束。ただし、SetCurrentValueを呼び出すと、プロパティが指定された値を取得することが保証されますが、バインディングは破棄されません。

私の知る限りでは、Gregのアドバイスは間違っています。 CLRラッパー・プロパティーには、常にGetValue/SetValueを使用する必要があります。 SetCurrentValueは、特定の値を取得するプロパティが必要ですが、プロパティに対して構成されたバインディング、トリガー、またはスタイルを上書きしないシナリオでは、より便利です。受け入れ答えにさらに

+2

Vincent Sibalのブログ(http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4- 0-related-apis.aspx)最後に以下を読むことができます。コントロール開発者にとって、コントロールコードのDependencyObject.SetCurrentValueを常にDependencyObject.SetCurrentValueを使用することが推奨されています。4.0フレームワークのStockコントロールは、このプロパティを設定する代わりにこのAPIを使用するようにすべて更新されていますローカル値。どちらも正しいかもしれませんが、ここでの違いとブログからの推薦を説明できますか? –

+1

@Meleak:正直言って、投稿は少し不明だと思う。私は彼が、 'SetCurrentValue'はあなたのコントロール内で*内部的に*依存性プロパティの値を変更したい場所で使われるべきだと言っていたと思います。実際に、彼のサンプルプロジェクトを開けば、CLRプロパティラッパーに 'GetValue'と' SetValue'を使っています。確かに、.NET 4.0に対してオープンリフレクターをクラックさせても、それはまだそのケースであることがわかります。 –

+2

これまでは、Visual Studioで生成された 'SetValue'を使っていましたが、うまく動作します。私は本当にバインディングを破壊することによってあなたが意味するものを得ることはありません。最初の値を変更した後、私のバインディングは破壊されませんか?私はまだ変更を加えることができ、バインディングはまだ機能していますか? –

2

は:

私はthis postがSetCurrentValue()非常によく説明していることが分かりました。 Dependency Property Value Precedenceシステムがバインドされた値に対してローカルな値を取る方法に注意してください。コメント者の予期しない動作を説明します。

関連する問題