0

マークアップ拡張機能を書いています。私はこのようなXAMLを持っています

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

コンストラクターが1つの文字列引数を取るTestExtension。「SomeInfo」文字列を取得しているので、すべてが見つかります。今、私は拡張機能をネストして、次のようなものを書きたいです

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

そのままでは動作しません。System.Windows.Data.Binding型の引数を1つ取るコンストラクターを追加する必要がありました。

今私は知る必要があります

  1. Bindingオブジェクトから現在の値を取得するにはどうすればよいですか?
  2. いつこれを行う必要がありますか?何らかの方法で変更をサブスクライブする必要がありますか、それともProvideValueメソッドで毎回その値を要求する必要がありますか?

Update1 PropNameは、TextBlockのDataContextに対して解決する必要があります。

Update2関連する質問が見つかりました:データバインディングの値を解決するにはどうすればよいですか?

4

1 に答える 1

4

このようなバインディングは機能しません。これは、MarkupExtensionがなくDataContext、ビジュアルツリーに表示されないためです。また、バインディングオブジェクトを直接操作することは想定されていません。この拡張機能が本当に必要ですか?たぶん、バインディングだけとコンバーターで間に合わせることができますか?

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

また、バインディングを直接設定しない場合、ProvideValueメソッドは1回だけ呼び出されることに注意してください。これは、拡張機能にバインディングがある場合でも、あまり役に立たない場合があることを意味します(たとえば、複雑なコンテンツを返す場合など、いくつかの例外があります。バインディングを使用しますが、文字列だけItemsControlの拡張子を設定しTextBlock.Textます)。したがって、バインディングに基づいて値が動的に変更される必要がある場合は、このようなMarkupExtensionを使用するかどうかは本当に疑問です。前述のように、代わりにさまざまな値のコンバーターまたはマルチバインディングを検討してください。

于 2011-09-26T20:09:45.563 に答える