我试图了解依赖属性的值解析方法。 当我查看DependencyObject的GetValue方法时,我看到它正在调用
return GetValueEntry(
LookupEntry(dp.GlobalIndex),
dp,
null,
RequestFlags.FullyResolved).Value;
我在下面的代码块中找到了GetValueEntry内部方法-
if (entryIndex.Found)
{
if ((requests & RequestFlags.RawEntry) != 0)
{
entry = _effectiveValues[entryIndex.Index];
}
else
{
entry = GetEffectiveValue(
entryIndex,
dp,
requests);
}
}
据我了解,当相应的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操作中对此进行检查?