1

MarkupExtensionバインディングを定義するために独自のメカニズムを使用できるようにするカスタムを作成しようとしていますが、自分MultiBindingからa を返そうとするMarkupExtensionと、上記の例外が発生します。

私は持っている:

<TextBlock Text="{my:CustomMarkup ...}" />

CustomMarkupを返しますがMultiBinding、明らかTextに a に設定されるのが好きではありませんMultiBinding。私が言うと、どうしてうまくいくのですか:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding ... />
    </TextBlock.Text>
</TextBlock>

でも、私のやり方ではうまくいきませんか?

4

2 に答える 2

2

MultiBinding自体を返さないでください。代わりに、 の結果を返しMultiBinding.ProvideValueます。

ところで、マークアップ拡張機能で正確に何をしていますか? MultiBindingオーバーライドする必要がない場合は、おそらく から継承できますProvideValue(これは封印されています)。Converter適切なプロパティやその他のプロパティを設定するだけで、ほとんど何でも実現できます

于 2010-06-15T22:43:30.477 に答える
0

調査を行ったところ、MarkupExtension の ProvideValue メソッドでバインディングを実際に設定し、バインディングの現在の値を返すことになっていることがわかりました。少し直感に反しますが、これまでのところうまくいっているようです!

おおまかに私が最終的に得たものは次のとおりです。

public override object ProvideValue( IServiceProvider serviceProvider ) {
    IProvideValueTarget valueProvider = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );
    // only need to do this if they're needed in your logic:
    object @target = valueProvider.TargetObject;
    object @property = valueProvider.TargetProperty;

    MultiBinding result = new MultiBinding();

    // set up binding as per custom logic...

    return result.ProvideValue( serviceProvider );
}

ロジックを少し追加し、エラー処理を軽くしてサービスを提供します。

更新:のターゲットおよびプロパティ情報に基づいて、MultiBinding.ProvideValue() がバインディング自体をフックすることが判明しましたserviceProvider。それはずっときれいです。

于 2010-06-15T22:42:51.880 に答える