Как точно знать, что TargetProperty является свойством DataContext в расширении разметки

Я работаю над расширением разметки, которое должно работать только при назначении свойству зависимости DataContext.

Это реализуется расширением следующим образом:

public abstract class DataContextAssignableExtensionBase  : MarkupExtension
 {

    private void ThrowOnUnsupportedProperty(IServiceProvider serviceProvider)
    {
        var dataContextProp = TargetProperty as DependencyProperty;

        if (dataContextProp == null)
            throw new ...
        if (!(dataContextProp.Name.Equals("DataContext") || dataContextProp.Name.Equals("RuntimeDataContext")))
            throw new ...
    }
}

Теперь DataContext, скорее всего, навсегда останется именем DataContext, но все же..

Я хотел бы получить более "безопасный" способ убедиться, что расширение назначено свойству зависимости DataContext.

Помощь будет высоко ценится!

2 ответа

Просто сделайте сравнительное сравнение с определением свойства:

if (dataContextProp != FrameworkElement.DataContextProperty)
    throw ...

В дополнение к тому, что сказал @MikeStrobel, единственный способ узнать, является ли данный DependencyProperty свойством DataContext как во время разработки, так и во время выполнения, в.NET 4.5 и VS2013:

if(( dependencyProperty == FrameworkElement.DataContextProperty
 ||  dependencyProperty == FrameworkContentElement.DataContextProperty)
|| (DesignerProperties.GetIsInDesignMode(dependencyObject)&&
 dataContextProp.Name.Equals("RuntimeDataContext") )))
{

}

Где dependencyProperty и dependencyObject являются ссылками, полученными каким-либо образом,

И зависимость Property был получен в контексте ссылки на зависимость.

Другие вопросы по тегам