![](/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.