在 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。
我有一个 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。