解释DependencyObject GetValue方法

时间:2018-06-30 05:59:08

标签: c# .net wpf dependency-properties

我试图了解依赖属性的值解析方法。 当我查看DependencyObject的GetValue方法时,我看到它正在调用

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在EffectiveValues数组中具有Dependency属性的条目时,将执行此代码块。

现在是定义

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

因此,当我们从GetValue传递RequestFlags.FullyResolved时,(requests和RequestFlags.RawEntry)将始终为0。就是说,总是GetEffectiveValue 被叫。

我想念什么吗?何时从_effectiveValues [entryIndex.Index]中获取值?

此外,我可以看到以下代码行

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

我们如何更改现有Dependency属性的默认值? 为何在Get操作中对此进行检查?

0 个答案:

没有答案