![](/img/trans.png)
[英]How to stop model validation propagation on a property with multiple attributes
[英]How to stop WPF Property Value Inheritance propagation at certain boundaries
我有一个附加的属性,用于指定实现WPF属性值继承的“继承”选项。 我可以看到属性值在可视树中传播。 但是,对于大型视觉树,这可能会影响性能。
因此,我希望附加属性的附加属性值继承停止在某些边界处,更具体地说,是特定类的实例。
我已经阅读了关于FrameworkElement.InheritanceBehavior的信息,控件可以将其设置为SkipAllNext之类的东西,该属性可以停止属性值继承(尽管对于所有属性),但是也会影响资源查找。 对资源查找的影响是不可取的。
在附加属性或应作为边界的类中,是否还有其他方法可以控制传播?
我想要达到的目标是: WPF容器将所有子控件都变为只读 。 具有值继承的解决方案可以使所有控件都基于全局开关转换为只读,这非常好。 它只是具有此处和此处提到的性能损失。
AddOwner似乎可以工作:
class BoundaryElement : FrameworkElement {
public static readonly DependencyProperty CustomProperty =
AttachedProperties.CustomProperty.AddOwner(typeof(BoundaryElement),
new FrameworkPropertyMetadata() {Inherits = false});
}
我尝试通过OverrideMetadata
设置Inherits = false
,但这只会影响BoundaryElement
本身,并且附加的属性值继续传播到其子级。 AddOwner
有效地替换了BoundaryElement
处的属性,因此原始属性不存在要继承的属性。
我知道一种可能性。 这并不是您真正想要的,但是您可以使用DependencyProperty.OverrideMetadata
方法来覆盖扩展控件中的DependencyProperty
的PropertyMetadata
:
public class SomeControl : OriginalControl
{
static SomeControl()
{
OriginalControl.SomeProperty.OverrideMetadata(typeof(SomeControl),
new FrameworkPropertyMetadata(defaultValue,
FrameworkPropertyMetadataOptions.OverridesInheritanceBehavior));
}
}
除此之外,(我可能是错的,但是)我认为您将无法实现自己的目标……WPF并不是那样设计的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.