在 ClearValue 之后未调用 CoerceValueCallback

CoerceValueCallback not called after ClearValue

我有一个 CheckBox,我已对其进行扩展以添加 IsReadOnly 属性。 属性 有一个 Coerce 回调,它将查找当前用户的访问权限,并且 return true,如果用户没有权限:

private static object CoerceIsReadOnly(DependencyObject d, object baseValue)
    {
        var owner = (CheckBox)d;

        bool isReadOnly = (bool)baseValue;
        if (isReadOnly == false)
        {
            if (AccessControl.HasFullAccess(owner) == false)
            {
                return true; // If we do not have access, and read only is false, we coerce it to true
            }
        }

        return baseValue;
    }

现在我做了一些实验来查看不同的值:

XAML

<vc:CheckBox Content="AccessControl" x:Name="ChkBoxAccessControl" Margin="5" vc:AccessControl.OverrideAccessRights="NoAccess"/>

代码隐藏

var defaultValue = CheckBox.IsReadOnlyProperty.GetMetadata(typeof(CheckBox)).DefaultValue; // False
var localValue = ChkBoxAccessControl.ReadLocalValue(CheckBox.IsReadOnlyProperty); // Unset (we didn't set a value in code or XAML)
var actualValue = ChkBoxAccessControl.GetValue(CheckBox.IsReadOnlyProperty); // True (coerced)

ChkBoxAccessControl.SetValue(CheckBox.IsReadOnlyProperty, false);
var localValue2 = ChkBoxAccessControl.ReadLocalValue(CheckBox.IsReadOnlyProperty); // False
var actualValue2 = ChkBoxAccessControl.GetValue(CheckBox.IsReadOnlyProperty); // True

ChkBoxAccessControl.ClearValue(CheckBox.IsReadOnlyProperty);
var localValue3 = ChkBoxAccessControl.ReadLocalValue(CheckBox.IsReadOnlyProperty); // Unser
var actualValue3 = ChkBoxAccessControl.GetValue(CheckBox.IsReadOnlyProperty); // false??? WTH...

所以令我惊讶的是,最后一个 actualValue3 return 是错误的。

显然在调用 ClearValue 时,它​​没有调用强制回调。这是可以预料的吗?谁能解释为什么这是正确的?

Is this to be expected?

是的,请参阅 this 回答。当您清除该值时,您将获得默认的非强制值。

此外,actualValue 在您的示例中没有被强制,但 actualValue2 是。

依赖项属性 存储并记住非强制值。您可以阅读有关此内容的更多信息 here