2011-06-22 15 views
1

バインディングをシミュレートするカスタムMarkupExtensionがあります。スタイルセッターで使用する場合には、たとえば、通常の割り当てで正常に機能しますが、:XamlParseExceptionでカスタムWPFバインディング

<Setter Property="Content" Value="{local:MyExtension}" /> 

結果:

A 'Binding' cannot be set on the 'Value' property of type 'Setter'. 
A 'Binding' can only be set on a DependencyProperty of a DependencyObject. 

これは、拡張機能の実装です:

public class MyExtension : MarkupExtension 
{ 
    public MyExtension() 
    { 
     Value = 123; 
    } 

    public object Value 
    { 
     get; 
     set; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var binding = new Binding("Value") 
     { 
      Source = this, 
     }; 
     return binding.ProvideValue(serviceProvider); 
    } 
} 

問題?!

答えて

2

推測の種類ですが、XAMLコンパイラにBindingクラスの特別なビルトインサポートがあり、このシナリオ(および他のもの)での使用が許可されている可能性があります。 BindingクラスもMarkupExtensionですが、残念ながらProvideValue()という実装はシールされています。 ProvideValueはとにかくBindingインスタンスを返しますので

public class MyBinding : Binding 
{ 
    private object value; 

    public object Value 
    { 
     get { return this.value; } 
     set 
     { 
      this.value = value; 
      this.Source = value; 
     } 
    } 
} 

:あなただけこれで逃げるかもしれない、と述べた

。ドキュメントから

0

オブジェクトは冷凍可能でなければなりません(そう、彼らは様々な利害関係者間で共有することができる)のように、それが見えます

http://msdn.microsoft.com/en-us/library/system.windows.setter.value.aspx

「データオブジェクト内で結合し、動的なリソースがあればサポートされています指定された値はFreezableオブジェクトです。「Binding Markup ExtensionおよびDynamicResource Markup Extension」を参照してください。 ProvideValue内部

+2

「バインディング」は「フリーズ可能」ではありません。したがって、特別なサポート。 –

0

なぜないあなた

return Value 

あなただけDependencyPropertyに特異的に結合することができます。 MyExtensionクラスのValueの依存関係プロパティを作成してください。

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Object), typeof(MyContentControl), new UIPropertyMetadata()); 
関連する問題