Как точно знать, что 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 был получен в контексте ссылки на зависимость.