2011-06-22 134 views
1

我有一個模擬綁定的自定義MarkupExtension。它的工作原理以及在正常作業,但在風格二傳手使用時,例如:自定義WPF綁定

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

導致XamlParseException:

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()

這就是說,你可能只是擺脫這樣的:

public class MyBinding : Binding 
{ 
    private object value; 

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

由於ProvideValue無論如何將返回Binding實例。

0

從文檔,它看起來像對象必須是可凍結(這樣他們就可以各有關方面之間共享)

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

「數據綁定和對象中的動態資源的支持,如果指定的值是Freezable對象,請參閱綁定標記擴展和DynamicResource標記擴展。「

+2

'綁定'不是'Freezable'。因此,特別支持。 –

0

你爲什麼不

return Value 

ProvideValue裏面?

其他

您可以綁定到只有DependencyProperty。在您的MyExtension課程中爲Value製作依賴項屬性!

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(Object), typeof(MyContentControl), new UIPropertyMetadata());