2011-01-07 16 views
11

Considere el siguiente XamlEspecifica que va de la propiedad entre la etiqueta de apertura y cierre en Xaml

<Grid> 
    <TextBox>Text</TextBox> 
    <Button>Content</Button> 
</Grid> 

Se fijará el

  • propiedad de texto de un cuadro de texto (sólo WPF)
  • Contenido Propiedad de un botón
  • Propiedad de niños de una cuadrícula

¿Pero cómo se especifica esto? ¿Cómo se especifica qué propiedad va entre la etiqueta de apertura y la de cierre en Xaml?
¿Está esto establecido por algunos metadatos en la Propiedad de dependencia o qué?

Gracias

+1

esa es una buena pregunta, me pregunté sobre eso también. – VoodooChild

+0

De hecho, no se puede hacer eso con un 'TextBox'. – AnthonyWJones

+0

@AnthonyWJones: ' Texto' funciona muy bien. ¿Qué quieres decir? Al mirar TextBox.cs con Reflector puedo ver que tiene 'ContentProperty (" Text ")' –

Respuesta

17

Hay una ContentPropertyAttribute que se aplica a una clase. WPF/Silverlight usará la reflexión para determinar qué propiedad usar.

Si desea hacer esto con una clase personalizada, puede hacerlo de esta manera:

[ContentProperty("Bar")] 
public class Foo : Control 
{ 
    public static DependencyProperty BarProperty = DependencyProperty.Register(
     "Bar", 
     typeof(int), 
     typeof(Foo), 
     new FrameworkPropertyMetaData(0)); 

    public int Bar 
    { 
     get { return (int)GetValue(BarProperty); } 
     set { SetValue(BarProperty, value); } 
    } 
} 

entonces se podría especificar que en XAML, así:

<lcl:Foo>12</lcl:Foo> 

actualización

Dado que utiliza la reflexión, realmente no necesita hacer una DependencyProperty. Por ejemplo, esto también funcionará:

[ContentProperty("Bar")] 
public class Foo : Control 
{ 
    public int Bar { get; set; } 
} 
+1

+1 ¡excelente! Ejemplo completo y todo, gracias! –

+1

El bit sobre 'ContentProperty' es correcto; sin embargo, al menos en Silverlight y WP7 la propiedad especificada no necesita ser una propiedad de dependencia. Silverlight/WP7 simplemente usa la reflexión para encontrar la propiedad especificada por el atributo 'ContentProperty', por lo que la propiedad del contenido puede ser cualquier propiedad cuyo tipo pueda ser analizado por Xaml. – AnthonyWJones

+0

@AnthonyWJones - Buen punto. Actualicé la respuesta para mostrar que se puede usar cualquier propiedad. –

Cuestiones relacionadas