题 DependencyProperty.Register()或.RegisterAttached()


这两者之间有什么区别,何时应该使用RegisterAttached()而不是.Register()?


35
2018-05-26 13:08


起源




答案:


我假设您的意思是DependencyProperty.Register和DependencyProperty.RegisterAttached。

DependencyProperty.Register用于注册正常的DependencyProperty。您可以将它们视为常规属性,并增加了它们可以参与WPF的DataBinding,动画等的转折。 实际上,它们作为普通属性(使用get和set访问器)公开在无类型DependencyObject.SetValue / GetValue之上。 您将这些声明为您的类型的一部分。

另一方面,附属物是不同的。它们是指可扩展性系统。如果您曾在Windows窗体中使用Extender,它们有点类似。 您将它们声明为类型的一部分,以便在另一种类型上使用。

它们用于布局相关信息。例如,Canvas需要Left / Top坐标,Grid需要一个Row和一个Column,DockPanel需要一个Dock信息等。如果所有这些都必须在可以布局的每个Control上声明,那将是一团糟。所以它们在相应的面板上声明,但在任何Control上使用。

如果需要,可以使用相同的东西将任何信息附加到DependencyObject。只需声明一条可以在xaml中设置的信息就可以派上用场,以便稍后在现有类的样式中使用。

所以这两种DependencyProperty服务于一个非常不同的目的。常规属性(通过Register()注册)与普通属性一样,作为类型接口的一部分使用。附加属性(通过RegisterAttached()注册)用作现有类的可扩展点。

希望澄清一下。


48
2018-05-27 05:04



所以attach可以用来向你不拥有的类添加属性吗?这有区别吗? - Vaccano
非常感谢你 ! - Hùng Lê Xuân
您可以设置相关属性 不 其他对象上的附加属性: this.button.SetValue(TextBox.TextProperty, "text"); (哪里 this.button 是类型 System.Windows.Controls.Button)。这非常好,所以答案并不完全。必须有更多。 - bitbonk


你的意思是 DependencyProperty.Register() 和 DependencyProperty.RegisterAttached(), 偶然? MSDN未列出DependencyProperty.Attach()或DependencyProperty.AttachRegistered()。

DependencyProperty.Register()和DependencyProperty.RegisterAttached()之间的区别在于.Register()用于在DependencyObject上注册“常规”依赖项属性,而.RegisterAttached()用于设置“附加”依赖项属性。

两种类型的依赖项属性之间的区别相当简单:在特定的DependencyObject上设置常规依赖项属性,就像使用任何其他.NET属性一样。另一方面,附加属性与特定的DependencyObject(例如Grid)相关联,但是在完全独立的DependencyObject上设置,DependencyObject通常是定义附加属性的DependencyObject的子代(例如,Grid.Row,附加属性,已设置)在父网格的孩子们身上)。

附加属性的更多细节 在MSDN上


9
2018-05-27 00:19





使用Register或RegisterAttached注册的属性可以使用SetValue和GetValue附加到任何DependencyObject。但是,如果将Register注册的属性附加到ownerType以外的类型的对象,则不会使用其元数据(默认值除外)。这意味着诸如Inherits或AffectsMeasure之类的属性不适用于这些属性。如果您对附加属性的元数据感兴趣,则应使用RegisterAttached。

有关详细信息,请参阅我对类似问题的回答: Silverlight中附加和非附加依赖属性的区别


3
2017-09-19 07:18