【发布时间】: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 时,它并没有调用强制回调。这是可以预料的吗?谁能解释为什么这是正确的?
【问题讨论】: