【问题标题】:CoerceValueCallback not called after ClearValue在 ClearValue 之后未调用 CoerceValueCallback
【发布时间】:2020-03-26 12:56:40
【问题描述】:

我有一个 CheckBox,我已扩展它以添加 IsReadOnly 属性。该属性有一个 Coerce 回调,它将查找当前用户的访问权限,如果用户没有权限,则返回 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 返回 false。

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

【问题讨论】:

    标签: wpf dependency-properties


    【解决方案1】:

    这是意料之中的吗?

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

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

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

    【讨论】:

    • 好的,我明白了。那么实际值实际上是真的原因是因为我们在 OnApplyTemplate 中手动强制它......谢谢。
    猜你喜欢
    • 2013-06-06
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2021-01-05
    相关资源
    最近更新 更多