Кто-нибудь знает, как определить, наследуется ли значение свойства WPF? В частности, я пытаюсь определить, был ли DataContext
из FrameworkElement
унаследован от родителя или установлен непосредственно непосредственно в самом элементе.
Определите, наследуется ли значение свойства DependencyProperty WPF
Ответ 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 (что и делает для каждой работы). также, по моему опыту, обычно проще писать иерархические алгоритмы с точки зрения счетчиков, а не коллекций, поэтому меня не удивляет, что они не предоставят этого.