wpf workflow-foundation dependency-properties

wpf - DependencyProperty.Register() o.RegisterAttached()



workflow-foundation dependency-properties (3)

¿Cuál es la diferencia entre los dos, cuándo debe usarse RegisterAttached () en lugar de .Register ()?


¿Quiere decir DependencyProperty.Register() y DependencyProperty.RegisterAttached() , por casualidad? MSDN no enumera DependencyProperty.Attach () o DependencyProperty.AttachRegistered ().

La diferencia entre DependencyProperty.Register () y DependencyProperty.RegisterAttached () es que .Register () se utiliza para registrar una propiedad de dependencia ''regular'' en un DependencyObject, mientras que .RegisterAttached () se usa para establecer una propiedad de dependencia ''adjunta''.

La diferencia entre los dos tipos de propiedades de dependencia es razonablemente sencilla: las propiedades de dependencia regulares se establecen en un objeto DependencyObject en particular como lo haría con cualquier otra propiedad .NET. Las propiedades adjuntas, por otro lado, están asociadas con un DependencyObject particular (por ejemplo, Grid) pero están configuradas en un DependenYObject completamente separado, a menudo un elemento secundario de DependencyObject que define la propiedad adjunta (por ejemplo, Grid.Row, una propiedad adjunta, se establece en los hijos de un Grid padre).

Se encuentran más detalles sobre las propiedades adjuntas en MSDN .


Supongo que se refería a DependencyProperty.Register y DependencyProperty.RegisterAttached.

DependencyProperty.Register se usa para registrar DependencyProperty normal. Puede verlos como propiedades normales, con la ventaja añadida de que pueden participar en el enlace de datos, animaciones, etc. de WPF. De hecho, están expuestos como propiedad normal (con los accesadores get y set) sobre DependencyObject.SetValue sin tipo. / GetValue. Usted declara esos como parte de su tipo.

Las propiedades adjuntas por otro lado son diferentes. Están pensados ​​como un sistema de extensibilidad. Si alguna vez usó Extenders en Windows Forms, son similares. Usted los declara como parte de un tipo, para ser utilizado en otro tipo.

Se usan mucho para la información relacionada con el diseño. Por ejemplo, Canvas necesita coordenadas Izquierda / Superior, Grid necesita una Fila y una Columna, DockPanel necesita una información de Dock, etc. Sería un desastre si todo esto tuviera que declararse en cada Control que se pueda distribuir. Por lo tanto, se declaran en el panel correspondiente, pero se usan en cualquier control.

Puede usar lo mismo para adjuntar cualquier información a DependencyObject si es necesario. Puede ser útil simplemente para declarar una información que puede establecer en xaml para ser utilizada más adelante en un estilo para una clase existente, por ejemplo.

Entonces esos dos tipos de DependencyProperty tienen un propósito muy diferente. Las propiedades normales (registradas a través de Register ()) se usan como propiedades normales como parte de la interfaz de su tipo. Las propiedades adjuntas (registradas a través de RegisterAttached ()) se utilizan como un punto de extensibilidad en las clases existentes.

Espero que eso lo aclare un poco.


Una propiedad registrada con Register o RegisterAttached se puede adjuntar a cualquier DependencyObject con SetValue y GetValue. Pero si adjunta una propiedad registrada con Register a un objeto de tipo distinto de ownerType, sus metadatos no se usarán (a excepción de un valor predeterminado). Significa que los atributos como Inherits o AffectsMeasure no funcionarán para estas propiedades. Debería usar RegisterAttached si está interesado en los metadatos de las propiedades adjuntas.

Para más detalles, consulte mi respuesta a una pregunta similar: Diferencia entre las propiedades de dependencia adjunta y no adjunta en Silverlight