在wpf中使用依赖属性

我不太清楚,如果我对此有正确的把握,我读过的内容似乎与我正在尝试做的事情一致,但是它似乎并不奏效。

如果我将一个额外的所有者添加到类的依赖项属性中,每当原始类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不会更改。

我在理解中错过了什么?

UPDATE

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

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


正如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属性可以返回您的集合的枚举器。


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

DP是用于当一个类想要自己的可绑定,可调整等属性的时候。 就像.NET的属性一样,它们在其类中也有作用域。 您可以在单个对象上注册属性已更改的事件,但不能全局注册。 TextBox.Text就是一个例子。 请注意, Label.TextTextBox.Text无关。

当一个类想要装饰具有附加属性的另一个对象时,AP是用于此目的的。 声明AP的类能够侦听拥有此AP集的其他对象的所有实例上的属性已更改事件。 Canvas.Left就是一个例子。 请注意,您始终必须符合此设置程序: <Label Text="Hi" Canvas.Left="50"/>

链接地址: http://www.djcxy.com/p/67563.html

上一篇: Using dependency properties in wpf

下一篇: Why does my data binding see the real value instead of the coerced value?