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