2013-12-10 159 views
6

我想以編程方式找出屬性的默認綁定模式。如何獲得依賴項屬性的默認綁定模式?

例如,如果我檢查它對TextBox.TextProperty它應該是BindingMode.TwoWay,但如果它是ItemsControl.ItemsSourceProperty它應該是BindingMode.OneWay

我實現了自定義的MarkupExtension,並已在我的代碼,以便遠遠得到這樣的:

public override object ProvideValue(IServiceProvider provider) 
{ 
    var service = provider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; 

    if (service != null) 
    { 
     var target = service.TargetObject as DependencyObject; 
     var property = service.TargetProperty as DependencyProperty; 

     // Not sure what to do with the target and propery here... 
    } 
} 

回答

4

使用DependencyProperty.GetMetadataDependencyObject。這會給你一個PropertyMetadata的值,通常是FrameworkPropertyMetadata的一個實例。如果可能,轉換爲該類型並檢查BindsTwoWayByDefault的值。

例如:

var metadata = property.GetMetadata(target) as FrameworkPropertyMetadata; 
if (metadata != null) 
{ 
    var isTwoWay = metadata.BindsTwoWayByDefault; 
} 
+0

我猜測,這個答案是沒有辦法的一個DependencyProperty在默認情況下被設置爲'BindingMode.OneTime'?它是TwoWay還是不是? – michael

+0

@michael:對於框架特定的屬性,是的。 「OneTime」和「OneWayToSource」AFAIK僅用於更好地支持與純.NET屬性的數據綁定。 – Jon