让附加属性继承传播

5
我在视觉层次结构中的父子元素间传递附加属性值遇到了问题。设置如下:
我有一个自定义面板,实例化Viewport3D。然后该面板处理添加或删除的子项以创建并添加每个子项的继承Visual3D类。
我尝试声明一个名为AttachedToggle property的附加属性。我希望该属性驻留在一个名为AttachedToggle的外部所有者类中,该类实现单个附加依赖属性IsChecked,并允许父面板或任何子级Visual3D元素能够更改该值,并使其他元素的实例值反映出更改。无论面板还是Visual3D类都没有继承自公共基类。这可行吗?
我可以成功地从应用程序代码中使用Set/GetValue更改IsChecked的父和子实例值,但无法使更改传播。

2
当您执行RegisterAttached时,是否在元数据中包含了Inherits选项?http://msdn.microsoft.com/en-us/library/ms753197.aspx - Dan Bryant
2个回答

19

根据属性值继承的文档,这应该可以正常工作。请确保您注册属性的调用如下所示:

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

-注意 Inherits 标志。查看文档了解FrameworkPropertyMetadata (以及FrameworkPropertyMetadataOptions - 如果需要,可以使用 OverridesInheritanceBehavior)。


5
要是文档总是能按照预期运行就好了。是的,DP上设置了FrameworkPropertyMetadataOptions.Inherits。但仍未按预期工作。 - giri

0

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

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

请参考,附加属性确实会传播。 - VeV
传播不是默认的,需要在属性定义中添加相关元数据。请参阅此答案 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接