Объясните метод DependencyObject GetValue - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь понять метод определения значения свойства зависимости. когда я смотрю в метод GetValue DependencyObject, я вижу, что он вызывает

return GetValueEntry(
                    LookupEntry(dp.GlobalIndex),
                    dp,
                    null,
                    RequestFlags.FullyResolved).Value;

Пожалуйста, обратитесь к https://referencesource.microsoft.com/#windowsbase/Base/System/Windows/DependencyObject.cs,f4481c3e6cb032a5

Внутри метода GetValueEntry я обнаружил следующий блок кода -

if (entryIndex.Found)
{
    if ((requests & RequestFlags.RawEntry) != 0)
    {
        entry = _effectiveValues[entryIndex.Index];
    }
    else
    {
        entry = GetEffectiveValue(
                    entryIndex,
                    dp,
                    requests);
    }
}

Пожалуйста, обратитесь к https://referencesource.microsoft.com/#windowsbase/Base/System/Windows/DependencyObject.cs,f4481c3e6cb032a5

Насколько я понимаю, этот блок кода выполняется, когда соответствующий DependencyObject имеет запись для свойства Dependency в массиве EffectiveValues, тогда этот блок кода выполняется.

Теперь следующее определение

internal enum RequestFlags
{
    FullyResolved = 0x00,
    AnimationBaseValue = 0x01,
    CoercionBaseValue = 0x02,
    DeferredReferences = 0x04,
    SkipDefault = 0x08,
    RawEntry = 0x10,
}

поэтому (запросы & RequestFlags.RawEntry) всегда будет 0, так как мы передаем RequestFlags.FullyResolved from GetValue. Так что это значит, всегда GetEffectiveValue позвонить.

Я что-то упустил? когда мы получим значение из _effectiveValues ​​[entryIndex.Index]?

Кроме того, я вижу следующую строку кода

else if (!dp.IsDefaultValueChanged)
{
    return EffectiveValueEntry.CreateDefaultValueEntry(dp, dp.DefaultMetadata.DefaultValue);
}

Как мы можем изменить значение по умолчанию для существующего свойства зависимости? И почему это проверяется в операции Get?

...