2013-12-10 107 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