CoerceValueCallback не вызывается после ClearValue - PullRequest
0 голосов
/ 26 марта 2020

У меня есть 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 он не вызывает принудительный обратный вызов. Это ожидать? Кто-нибудь может объяснить, почему это будет правильно?

1 Ответ

0 голосов
/ 26 марта 2020

Ожидается ли это?

Да, смотрите этот ответ. Когда вы очищаете значение, вы получаете значение по умолчанию без принуждения.

Кроме того, actualValue не приведено в вашем примере, но actualValue2.

Свойство зависимости хранит и запоминает значение без принуждения. Вы можете прочитать больше об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...