【问题标题】:Getting Attached property inheritance to propagate获取附加属性继承以传播
【发布时间】:2011-05-14 01:26:54
【问题描述】:

我在获取附加属性值以在视觉层次结构中从父级向下传播到子级时遇到问题。设置如下:

我有一个实例化 Viewport3D 的自定义面板。 Panel 然后处理添加和删除的子项,为每个子项创建和添加继承的 Visual3D 类。

我正在尝试声明一个名为 AttachedToggle 属性的附加属性。我想让这个属性驻留在一个名为 AttachedToggle 的外部所有者类中,该类实现单个附加依赖属性 IsChecked 并允许父 Panel 或任何子 Visual3D 元素能够更改值并拥有其他元素的实例值反映了变化。 Panel 和 Visual3D 类都不是从公共基础继承的。这个可以吗?

我可以使用 Set/GetValue 从应用程序代码中成功更改 IsChecked 的父实例值和子实例值,但无法传播更改。

【问题讨论】:

标签: wpf inheritance dependency-properties


【解决方案1】:

我不确定附加属性是否会沿逻辑树传播,但您可以尝试以下方法:

<Panel a:ToggleSwitch="Binding Path=(a:ToggleSwitch), 
           RelativeSource={RelativeSource Mode=FindAncestor, 
           AncestorType={x:Type Panel}}" />

【讨论】:

  • 作为参考,附加的属性会传播。
  • 传播不是默认的,需要将相关的元数据添加到属性的定义中。见this answer
【解决方案2】:

根据Property Value Inheritance 上的文档,这应该可以正常工作。确保您注册属性的调用如下所示:

public static readonly DependencyProperty IsChecked = 
    DependencyProperty.RegisterAttached(
    "IsChecked",
    typeof(Boolean),
    typeof(AttachedToggle),
    new FrameworkPropertyMetadata(false, 
        FrameworkPropertyMetadataOptions.Inherits)
  );

-注意Inherits 标志。请参阅FrameworkPropertyMetadata 的文档(和FrameworkPropertyMetadataOptions - 如果需要,您也可以使用OverridesInheritanceBehavior)。

【讨论】:

  • 如果事情总是按照文档工作。是的,在 DP 上设置了 FrameworkPropertyMetadataOptions.Inherits。但仍无法按预期工作。
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2014-02-03
相关资源
最近更新 更多