2010-11-30 11 views
11

MSDN says,¿La vinculación funciona SOLAMENTE con DependencyProperty?

  • Cada unión tiene típicamente estos cuatro componentes: un objetivo objeto de enlace, una propiedad de destino, un origen de enlace, y un camino para el valor en el origen de enlace de usar. Por ejemplo, si desea enlazar el contenido de un cuadro de texto a la propiedad Name de un objeto empleado, su objeto de destino es el cuadro de texto, la propiedad de destino es la propiedad Text, el valor a utilizar es Nombre y el objeto de origen es el objeto de empleado .

  • La propiedad de destino debe ser una propiedad de dependencia.

La cita anterior explica por qué funciona el siguiente código,

<TextBox Text="{Binding EmployeeName}"> 

Funciona porque texto es una propiedad de dependencia. Hasta este punto, todo está bien!


Mi pregunta es,

si la propiedad de destino debe ser una propiedad de dependencia de Encuadernación a trabajar, entonces ¿cómo funciona el folllowing Setter trabajo? Tenga en cuenta que Valor en Setter NO es una propiedad de dependencia.

<Style TargetType="{x:Type TextBox}"> 
     <Setter Property="Text" Value="{Binding EmployeeName}"/> 
</Style> 

He una explicación para ello. Pero no estoy seguro si eso es correcto. Déjame explicarlo primero, y luego, ustedes me corrigen si me equivoco. :-)

pienso, ya que el tipo de Valor es objeto, que significa, que puede contener instancias de cualquier tipo. Puede contener una instancia de tipo Binding uniforme. Sin embargo, no puede participar en el proceso de evaluación (o resolución) de la expresión de enlace, ya que no es una propiedad de dependencia. Así que el objeto Style simplemente transfiere este objeto de enlace (que guarda el valor) desde Setter al TextBox como tal, sin evaluar/resolver el valor de enlace. A medida que el organismo tales anterior se convierte en el equivalente a esto:

Text="{Binding EmployeeName}" 

Y desde ahora, el texto es una propiedad de dependencia, se puede resolver el valor de encadenamiento. Por lo tanto, parece que el objetivo de la vinculación es Valor, pero en realidad, el texto es el destino de la vinculación.

Es como Setter es un cartero, el valor en sí mismo es bolsa de cartero, instancia de enlace (es decir, lo que vale el valor) es una letra. El cartero (es decir, Setter) entrega la letra (es decir, la instancia de enlace) al destino (es decir, propiedad de texto), sin abrirlo, i.e sin saber qué Mensaje (es decir, Nombre del Empleado) lleva la Carta.

Corrígeme si me equivoco.

+0

¿Realmente funciona? Traté de hacer algo similar con los estilos TreeViewItem, pero no fue así. –

+0

En Silverlight, quiero decir. WPF admite definiciones vinculantes en estilos. –

+0

@Lex Lavnikov ... No me registré en Silverlight recientemente, no recuerdo si utilicé Binding en el estilo de Silverlight. De todos modos, puedes comenzar otro hilo para discutirlo. ¿Qué dices? – Nawaz

Respuesta

4

El XAML está configurando Setter.Value a un objeto del tipo Binding. El Style así creado establece la propiedad de dependencia Text en el objeto de destino en ese Binding, de modo que el enlace actualizará Text cada vez que cambie la propiedad de origen.

Si Setter.Value fuera una propiedad de dependencia, entonces el colocador terminaría siendo un intermediario en la notificación de cambio de propiedad: la propiedad de origen cambia, el enlace notifica al colocador, el colocador notifica al objetivo. Como es solo una propiedad de CLR, el colocador no está involucrado en la notificación de cambio: la propiedad de origen cambia y el enlace notifica al destino.

+0

... gracias por la respuesta ... el segundo párrafo es impresionante .. eso tiene mucho sentido para mí .. :-) – Nawaz

2

Eso es correcto. Si nos fijamos en el código fuente de los controles WPF toolkit, puede ver cómo se hace. DataGrid lo hace en bastantes lugares (por ejemplo, columnas específicas que pasan el enlace de contenido a la celda). Trataré de recordar agregar un enlace a un archivo específico y una línea donde esté hecho después del trabajo.

Editar Un buen ejemplo es la propiedad Binding en la clase DataGridBoundColumn. Se puede ver utilizado en

internal void ApplyBinding(DependencyObject target, DependencyProperty property) 

Si usted está interesado en los patrones avanzados para hacer WPF y Silverlight controla le recomiendo mirar a través de sus respectivas cajas de herramientas. Están bien comentados en general y algunos de los controles están usando un código genial.

+0

... gracias por la respuesta ... Analizaré el código fuente de DataGrid ... eso me parece muy interesante ... :-) – Nawaz

+0

.. y sí ... sería bueno si me dices el archivo específico y las líneas donde se hace ... :-) – Nawaz

+0

... gracias por esta valiosa actualización ... :) – Nawaz

Cuestiones relacionadas