Определите, наследуется ли значение свойства DependencyProperty WPF

Кто-нибудь знает, как определить, наследуется ли значение свойства WPF? В частности, я пытаюсь определить, был ли DataContext из FrameworkElement унаследован от родителя или установлен непосредственно непосредственно в самом элементе.

Ответ 1

DependencyPropertyHelper.GetValueSource даст вам ValueSource, который включает свойство для получения BaseValueSource. Перечисление BaseValueSource сообщает вам, откуда DependencyProperty получает свое значение, например, унаследованное от родителя, задается с помощью стиля или устанавливается локально.

Ответ 2

Обновлено после дополнительного копирования

Существует метод ReadLocalValue, который глупо читает вместо того, чтобы так сложно обнаружить в intellisense. (Я думаю, что в книге WPF от Apress есть заметка об этом.) Он вернет UnsetValue, если значение не было установлено.

if (ReadLocalValue(Control.DataContextProperty) != 
    DependencyProperty.UnsetValue)
{
    // Data context was set locally.
}

Если вам по какой-то причине необходимо получить все локально заданные свойства, вы можете использовать LocalValueEnumerator.

LocalValueEnumerator enumerator = GetLocalValueEnumerator();
while (enumerator.MoveNext())
{
    if (enumerator.Current.Property == Control.DataContextProperty)
    {
        // DataContext was set locally
    }
}

И эти два метода действительно заставляют меня задуматься. Прочитайте вместо Get в ReadLocalValue и коллекцию, которую вы не можете перебирать с помощью foreach в GetLocalValueEnumerator. Это как .Net имеет эти хорошие стандартные вещи, которые команда WPF просто решила игнорировать.

Ответ 3

перечислитель является стандартным, они просто не предоставляют коллекцию, которая использует этот перечислитель как результат метода GetEnumerator (что и делает для каждой работы). также, по моему опыту, обычно проще писать иерархические алгоритмы с точки зрения счетчиков, а не коллекций, поэтому меня не удивляет, что они не предоставят этого.