在wpf中使用依赖项属性

时间:2010-04-19 17:07:27

标签: wpf dependency-properties dependencies

我不太确定我是否对此有了正确的把握,我所读到的内容似乎与我正在尝试做的事情一致,但它似乎没有起作用。< / p>

如果我将一个额外的所有者添加到类的依赖项属性,那么每当orig类dp发生更改时,更改应该传播给其他所有者,是否正确?

我所拥有的是一个自定义控件,我想在其上设置属性,然后在自定义控件数据模板中的某些对象上继承此属性值。

public class Class1: DependencyObject{
  public static readonly DependencyProperty LongDayHeadersProperty;

  public bool LongDayHeaders {
     get { return (bool)GetValue(LongDayHeadersProperty); }
     set { SetValue(LongDayHeadersProperty, value); }
  }

  static Class1(){
    LongDayHeadersProperty = DependencyProperty.Register("LongDayHeaders", typeof(bool), typeof(Class1),
            new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));
  }
}

public class Class2: DependecyObject{
  public static readonly DependencyProperty LongDayHeadersProperty;

  public bool LongDayHeaders{
    get{ return(bool)GetValue(LongDayHeadersProperty); }
    set{ SetValue(LongDayHeadersProperty, value); }
  }

  static Class2(){
    LongDayHeadersProperty = Class1.LongDayHeadersProperty.AddOwner(typeof(Class2));
  }
}

但是如果我为两个属性分配一个DependencyPropertyDescriptor,它只会触发Class1而Class2不会改变。

我的理解中是否遗漏了一些内容?

更新

经过一些测试后,我甚至不确定我的子控件是否被视为逻辑树或可视树中的子控件。我认为是,但缺乏成功导致我不相信。

有许多class2存在于class1的可观察集合中。对我来说,这使他们成为class1的孩子?但即使我在class2上使用RegisterAttach,并在class1中设置属性,它似乎没有任何影响?

2 个答案:

答案 0 :(得分:0)

MSDN所述,Inherits标志仅在您使用RegisterAttached创建属性时才有效。您仍然可以使用属性的属性语法。

<强>更新

为清楚起见,我将如何定义属性:

public class Class1 : FrameworkElement
{
    public static readonly DependencyProperty LongDayHeadersProperty = 
        DependencyProperty.RegisterAttached("LongDayHeaders", 
        typeof(bool),
        typeof(Class1),
        new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits));

    public bool LongDayHeaders 
    {
        get { return (bool)GetValue(LongDayHeadersProperty); }
        set { SetValue(LongDayHeadersProperty, value); }
    }
}

public class Class2: FrameworkElement
{
    public static readonly DependencyProperty LongDayHeadersProperty = 
        Class1.LongDayHeadersProperty.AddOwner(typeof(Class2));

    public bool LongDayHeaders
    {
        get{ return(bool)GetValue(LongDayHeadersProperty); }
        set{ SetValue(LongDayHeadersProperty, value); }
    }
}

如果您希望您的孩子成为您控制的逻辑孩子,则需要致电AddLogicalChild。此外,您应该通过LogicalChildren属性公开它们。我还必须指出,这两个类必须派生自FrameworkElementFrameworkContentElement,因为逻辑树只是为这些元素定义的。

由于您使用的是ObservableCollection,因此您可以根据更改处理集合更改事件和添加/删除子项。此外,LogicalChildren属性只能返回您的集合的枚举器。

答案 1 :(得分:0)

您将DependencyProperties与Attached(Dependency)属性混淆。

DP用于当一个类本身需要可绑定,可设置类似的属性时。就像.NET属性一样,它们在其类中具有范围。您可以在单个对象上注册属性更改事件,但不能在全局注册。 TextBox.Text就是一个例子。请注意,Label.TextTextBox.Text无关。

AP适用于某个类想要装饰具有其他属性的另一个对象的情况。声明AP的类能够侦听具有此AP集的其他对象的所有实例上的属性更改事件。 Canvas.Left就是一个例子。请注意,您始终必须限定此setter:<Label Text="Hi" Canvas.Left="50"/>