不继承依赖属性值

时间:2014-03-19 19:15:00

标签: wpf dependency-properties

我用FrameworkPropertyMetadataOptions.Inherits声明了一个依赖属性:

public static class DesignerItemStyles {
    public static readonly DependencyProperty HeaderBackgroundProperty = 
        DependencyProperty.RegisterAttached(
            "HeaderBackground", typeof(Brush), typeof(DesignerItemStyles),
            new FrameworkPropertyMetadata(
                Brushes.DesignerViewElementHeaderBackground,
                FrameworkPropertyMetadataOptions.Inherits));

    /* Below are Get & Set as usual */
}

它有点工作,但不知何故不是整个视觉树。以下是显示从ContentPresenter继承价值的HeaderedDesignerItemChrome的屏幕截图: Node that inherits value

现在,屏幕截图显示ContentPresenter的内容,并且不会继承该值。它也没有被设置为其他东西 - 它是默认值: Direct child that does not

知道为什么吗?

2 个答案:

答案 0 :(得分:7)

使用它并不是那么简单,因为有一些规则需要遵循以实现具有可继承值的属性。他们在这里:

在父级上,依赖属性必须定义为附加属性。您仍然可以声明属性getter / setter,但必须附加属性。这是一个简单的声明:

public static readonly DependencyProperty InheritedValueProperty =
   DependencyProperty.RegisterAttached("InheritedValue",
   typeof(int), typeof(MyClass), new FrameworkPropertyMetadata(0, 
   FrameworkPropertyMetadataOptions.Inherits));
public static int GetInheritedValue(DependencyObject target)
{
   return (int)target.GetValue(InheritedValueProperty);
}
public static void SetInheritedValue(DependencyObject target, int value)
{
   target.SetValue(InheritedValueProperty, value);
}
public int InheritedValue
{
   get
   {
      return GetTimeSlotDuration(this);
   }
   set
   {
      SetTimeSlotDuration(this, value);
   }
}

子对象将使用AddOwner定义具有继承值的属性实例。以下是MyChildClass示例类的代码:

public static readonly DependencyProperty InheritedValueProperty;
public int InheritedValue
{
   get
   {
      return (int)GetValue(InheritedValueProperty);
   }
   set
   {
      SetValue(InheritedValueProperty, value);
   }
}
static MyChildClass()
{
   InheritedValueProperty = 
       MyClass.InheritedValueProperty.AddOwner(typeof(MyChildClass),
           new FrameworkPropertyMetadata(0,
                   FrameworkPropertyMetadataOptions.Inherits));
}

如果使用单个参数重载,则保留全局默认值并且继承仍然有效...

MyClass.InheritedValueProperty.AddOwner(typeof(MyChildClass));

请注意,属性在子类中声明为标准依赖项属性,并且它在元数据选项中指定Inherit。

现在,当MyChildClass以可视方式或逻辑方式成为MyClass的父级时,它们会自动共享相同的属性值。

从技术上讲,你在Visual Tree中看到的就是做你告诉它做的事情。它设置了您告诉它的默认值,并且继承的控件继承自您的ContentPresenter的父级值

答案 1 :(得分:0)

消除两个ContentPresenters中的一个(在DesignerItemsPresenter上方的两个屏幕截图中都可见)为我工作。我倾向于认为这是WPF框架本身的一个错误。