2011-09-26 8 views
0

マークアップ拡張を書いています。私はこのようなXAMLを持っています現在のバインディング値

<TextBlock Text="{ui:Test SomeInfo}" /> 

そして1つの文字列引数を取るコンストラクタを持つTestExtensionがあります。私は "SomeInfo"文字列を得て、すべてが見つかるようにします。今度は拡張子をネストして、

<TextBlock Text="{ui:Test {Binding PropName}}" /> 

のように書いて、そのまま動作させたいと思います。 System.Windows.Data.Binding型の引数を1つ取るコンストラクタを追加する必要がありました。

は今、私はBindingオブジェクトから現在の値を取得する必要がありますどのように

  1. を知っておく必要がありますか?
  2. いつすればよいですか?私は何らかの方法で変更を購読するか、ProvideValueメソッドで毎回その値を尋ねるべきですか?

アップデート1 PROPNAMEはのTextBlockのDataContextのに対して解決されなければなりません。

アップデート2ちょうど関連する質問が見つかりました:あなたのMarkupExtensionは何DataContextを持っていないし、それがビジュアルツリーに表示されていないと私はあなたがバインディングと対話することになっているとは思わないので、このようなHow do I resolve the value of a databinding?

答えて

4

バインディングが動作しません。オブジェクトを直接。あなたは本当にこの拡張子が必要ですか?たぶんあなたは唯一のバインディングとconverterで何かできますか?

あなたはは(DependencyObjectから継承して)バインド可能なプロパティを持つ専用のクラスを作成することができない場合は、これは、しかし、まだあなたがそうElementNameために必要DataContextまたは名前スコープまたはRelativeSourceのために必要なビジュアルツリーを、明らかにしませんでしたその状況で拘束力のある作業を行う唯一の方法は、Sourceを使用することです(たとえば、StaticResourceに設定してください)。これはほとんど理想的ではありません。

ProvideValueメソッドはバインディングを直接設定しないと、メソッドが1回だけ呼び出されることに注意してください。これは、拡張機能にバインディングがあっても非常に便利であるとは限りません。バインディングを使用するItemsControlのような複雑なコンテンツですが、文字列であるTextBlock.Textに拡張子を設定しているので、バインディングに基づいて値を動的に変更する必要がある場合は、このようなMarkupExtensionを使用することは本当に疑問です。先に注記したように、さまざまな値の代わりにconvertersまたはMultiBindingsを使用してください。

+0

実際、TextblockのDataContextを使用したいと思います。 – adontz

+0

@adontz:私が言ったように、普通のBindingをコンバーターで使う方が良いかもしれません。あなた自身のMarkupExtensionの中のバインディングをうまく使うのは苦痛です。 –

+0

マークアップユーザーに私にとって重要なより一貫した構文を提供するので、私はこの痛みを受け入れます。 – adontz

関連する問題