我不太确定我是否对此有了正确的把握,我所读到的内容似乎与我正在尝试做的事情一致,但它似乎没有起作用。< / 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中设置属性,它似乎没有任何影响?
答案 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
属性公开它们。我还必须指出,这两个类必须派生自FrameworkElement
或FrameworkContentElement
,因为逻辑树只是为这些元素定义的。
由于您使用的是ObservableCollection
,因此您可以根据更改处理集合更改事件和添加/删除子项。此外,LogicalChildren
属性只能返回您的集合的枚举器。
答案 1 :(得分:0)
您将DependencyProperties与Attached(Dependency)属性混淆。
DP用于当一个类本身需要可绑定,可设置类似的属性时。就像.NET属性一样,它们在其类中具有范围。您可以在单个对象上注册属性更改事件,但不能在全局注册。 TextBox.Text
就是一个例子。请注意,Label.Text
与TextBox.Text
无关。
AP适用于某个类想要装饰具有其他属性的另一个对象的情况。声明AP的类能够侦听具有此AP集的其他对象的所有实例上的属性更改事件。 Canvas.Left就是一个例子。请注意,您始终必须限定此setter:<Label Text="Hi" Canvas.Left="50"/>