当我在运行时设置 IsClosed
的值时, OnIsClosedChanged()
被称为罚款 . 但是,Designer会设置属性的值,但不会调用 OnIsClosedChanged()
.
public static DependencyProperty IsClosedProperty = DependencyProperty.Register("IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public bool IsClosed {
get {
return (bool)this.GetValue(IsClosedProperty);
}
set {
if ((bool)this.GetValue(IsClosedProperty) == value)
return;
this.SetValue(IsClosedProperty, value);
OnIsClosedChanged();
}
}
private void OnIsClosedChanged() {
_rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star);
}
显然,Designer未修改 IsClosed
,只有 IsClosedProperty
接收到xaml更改 .
我的问题是:如何在Designer中修改了值后运行 IsClosed
. 或者至少为非运行时更改添加一些逻辑 .
2 回答
您必须使用属性元数据注册PropertyChangedCallback .
原因是在XAML中设置的依赖项属性或绑定或某些其他源不设置CLR包装器(setter方法) . 原因在MSDN上的XAML Loading and Dependency Properties文章中解释:
您的代码应如下所示:
现在就找到了答案 . ValidateValueCallback非常接近! (正如Alex K指出的那样)但它是一个静态方法,我没有得到任何已更改的实例的引用 . 关键是在FrameworkPropertyMetadata中使用PropertyChangedCallback,它也是传递给Property.Register方法的参数 .
看到:
现在确实重新设置
IsClosedValue
,触发OnIsClosedChanged
运行 .谢谢你的帮助!