好吧,如果您想在SuperOld 更改时强制Age 属性,请调用CoerceValue。您可以在microsoft docs 上阅读更多相关信息。关键信息是,此方法使用“baseValue”调用您的 CoerceValueCallback,在您的情况下为 56。
这是一个最小的工作示例:
public class Person : DependencyObject
{
public static readonly DependencyProperty AgeProperty = DependencyProperty.Register(
"Age",
typeof(int),
typeof(Person),
new PropertyMetadata(default(int), AgeChanged, CoerceAge));
public static readonly DependencyProperty IsSuperOldProperty = DependencyProperty.Register(
"IsSuperOld",
typeof(bool),
typeof(Person),
new PropertyMetadata(default(bool), IsSuperOldChanged));
public int Age
{
get => (int)GetValue(AgeProperty);
set => SetValue(AgeProperty, value);
}
public bool IsSuperOld
{
get => (bool)GetValue(IsSuperOldProperty);
set => SetValue(IsSuperOldProperty, value);
}
private static void AgeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
private static object CoerceAge(DependencyObject d, object basevalue)
{
var person = (Person)d;
if (person.IsSuperOld)
{
return 999;
}
return basevalue;
}
private static void IsSuperOldChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
d.CoerceValue(AgeProperty);
}
}
这是 NUnit 测试:
[Test]
public void Should_work_like_in_blog()
{
Person p = new Person();
p.Age = 28;
p.IsSuperOld = true; // Age coerced to 999
Assert.That(p.Age, Is.EqualTo(999));
p.Age = 56; // Age still 999
p.IsSuperOld = false; // Age now becomes 56
Assert.That(p.Age, Is.EqualTo(56));
}