wpf - ¿Cuál es la diferencia entre x: Reference y ElementName?
xaml markup (2)
De acuerdo con la x: página de extensión de marcado de referencia en MSDN, x:Reference
Hace referencia a una instancia que se declara en otro lugar en el marcado XAML. La referencia se refiere a un elemento x: Nombre.
De acuerdo con la página de propiedad Binding.ElementName en MSDN, ElementName
El valor de la propiedad Name o x: Name Directive del elemento de interés.
Mirando hacia atrás en la sección de comentarios en la primera página:
x: Referencia y WPF
En WPF y XAML 2006, las referencias de elementos se abordan mediante la característica de nivel de marco de enlace de ElementName. Para la mayoría de las aplicaciones y escenarios WPF, aún se debe usar el enlace ElementName. Las excepciones a esta guía general pueden incluir casos en los que haya contexto de datos u otras consideraciones de alcance que impidan el enlace de datos y en los que no esté involucrada la compilación de marcado.
Para completar, aquí es parte de la sección de comentarios en la página ElementName
:
Esta propiedad es útil cuando desea enlazar a la propiedad de otro elemento en su aplicación. Por ejemplo, si desea usar un control deslizante para controlar la altura de otro control en su aplicación, o si desea vincular el contenido de su control a la propiedad SelectedValue de su control ListBox.
Ahora, aunque soy plenamente consciente de cuándo y cómo usar la propiedad ElementName
, no entiendo completamente la diferencia entre ella y la extensión x:Reference
markup. ¿Puede alguien explicar esto y, en particular, ampliar la última oración que se muestra en la sección x:Reference
Comentarios de x:Reference
?:
Las excepciones a esta guía general pueden incluir casos en los que haya contexto de datos u otras consideraciones de alcance que impidan el enlace de datos y en los que no esté involucrada la compilación de marcado.
Básicamente, como dijiste, esos dos hacen casi lo mismo. Sin embargo, hay pequeñas diferencias debajo del capó.
{x:Reference ...}
-> devuelve solo una referencia de un objeto que no crea ese "puente" entre dos propiedades, como el enlace. Detrás de todo lo que se usa un servicio que busca el nombre de pila en un ámbito específico que suele ser la ventana en sí.
{Binding ElementName="..." }
-> en primer lugar, crea ese objeto vinculante, luego busca el nombre del objeto pero no utiliza la misma técnica bajo el capó como x: Referencia. El algoritmo de búsqueda se mueve hacia arriba o hacia abajo en VisualTree para encontrar el elemento deseado. Por lo tanto, siempre se necesita un VisualTree funcional. Como ejemplo cuando se usa dentro de un elemento no UiElement, no funcionará. Al final, el enlace se mantiene y hace su pan de cada día.
Esto no funcionará:
<StackPanel>
<Button x:name="bttn1" Visibility="Hidden">Click me</Button>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/>
....
Esto funciona:
<StackPanel>
<Button x:name="bttn1" Visibility="Hidden">Click me</Button>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/>
....
Algo así :)
ElementName es específico de la plataforma. Es decir, puede o no estar presente según la plataforma que esté utilizando. x: la referencia eleva ese concepto a una función nativa XAML. Por lo tanto, cualquier plataforma que admita XAML admite x: Referencia.