在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
属性公开它们。 我还必须指出,这两个类必须来自FrameworkElement
或FrameworkContentElement
,因为逻辑树只是为这些元素定义的。
由于您使用的是ObservableCollection
,因此您将处理收集更改的事件,并根据更改添加/删除子项。 此外, LogicalChildren
属性可以返回您的集合的枚举器。
您将DependencyProperties与Attached(Dependency)属性混淆。
DP是用于当一个类想要自己的可绑定,可调整等属性的时候。 就像.NET的属性一样,它们在其类中也有作用域。 您可以在单个对象上注册属性已更改的事件,但不能全局注册。 TextBox.Text
就是一个例子。 请注意, Label.Text
与TextBox.Text
无关。
当一个类想要装饰具有附加属性的另一个对象时,AP是用于此目的的。 声明AP的类能够侦听拥有此AP集的其他对象的所有实例上的属性已更改事件。 Canvas.Left就是一个例子。 请注意,您始终必须符合此设置程序: <Label Text="Hi" Canvas.Left="50"/>
上一篇: Using dependency properties in wpf
下一篇: Why does my data binding see the real value instead of the coerced value?