wpf xaml binding path

wpf templates



Son "{Binding Path=.}" Y "{Binding}" realmente iguales (4)

En mi proyecto de WPF, tengo un ListBox que muestra elementos de una colección List<string> . Quería que el texto de estos elementos fuera editable, así que envolví cada uno de ellos en una ItemTemplate con un TextBox (podría no ser la mejor manera, pero soy nuevo en WPF). Estaba teniendo problemas simplemente vinculando la propiedad TextBoxes ''Text al valor de cada elemento. Finalmente encontré un ejemplo usando un único punto o punto para su propiedad Path ( {Binding Path=.} ):

<ListBox ItemsSource="{Binding ElementName=recipesListbox,Path=SelectedItem.Steps}"> <ListBox.ItemTemplate> <DataTemplate> <TextBox Text="{Binding Path=.}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox>

Sin embargo, no entiendo por qué simplemente el uso de {Binding} no funcionó.

Planteó una excepción de " enlace bidireccional requiere Path o XPath ", según Microsoft .

[...] una ruta de punto (.) se puede usar para enlazar a la fuente actual. Por ejemplo, Text = "{Binding}" es equivalente a Text = "{Binding Path =.}"

¿Podría alguien arrojar luz sobre este comportamiento ambiguo?

EDITAR: Por otra parte, parece que {Binding Path=.} No da obligatoriamente una vinculación bidireccional, ya que al modificar el texto y mover el foco no se actualiza la fuente subyacente (la misma fuente también tiene propiedades visualizadas y modificadas satisfactoriamente en un control DataGrid ) Definitivamente me falta algo aquí.


El objetivo de la excepción es, presumiblemente, que no se puede vincular en dos direcciones una fuente de enlace en sí misma, por lo que intenta evitar que cree una vinculación que no se comporte de la manera que le gustaría. Al usar {Binding Path=.} Simplemente engañas el manejo de errores.

(Tampoco es extraño que la documentación sea errónea o inexacta, aunque me gusta mucho la documentación de MSDN en general, ya que normalmente contiene los puntos cruciales que a uno le interesan)


En resumen, la diferencia entre los dos es análoga a la diferencia entre el paso tradicional por valor y el pase por referencia. (FYR - ¿Cuál es la diferencia entre pasar por referencia y pasar por valor? )

Sin embargo, no entiendo por qué simplemente el uso de {Binding} no funcionó (se planteó una excepción de "enlace bidireccional requiere Path o XPath")

Supongamos ahora que {Binding} se puede usar para el enlace bidireccional. En general, {Binding} crea un enlace basado en el valor con datacontext que no permite actualizar el contexto de datos.

Mientras que {Binding Path=.} Crea un enlace basado en la referencia con el área de memoria referenciada por la ''Ruta'' que permite actualizar el valor a través de la referencia (en este caso ''dot'' el actual contexto de datos).

¡Espero que esto ayude!


Estos no son lo mismo. Si enlaza esto donde ConsoleMessages es una cadena ObservableCollection con solo {Binding} obtiene un "enlace bidireccional que requiere Path o XPath". excepción donde funciona como {Binding Path =.}. Esto es con WPF 4.0 ...

<ItemsControl x:Name="ConsoleOutput" ItemsSource="{Binding ConsoleMessages, Mode=OneWay}" MaxHeight="400"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBox Text="{Binding Path=.}" BorderThickness="0" Margin="0" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>

Mi 2p vale ...


La documentación indica que {Binding} es equivalente a {Binding Path=.} . Sin embargo, no es equivalente a {Binding Path} como ha escrito. Si incluye la propiedad Path , debe asignarla a algo, ya sea Path=. o Path=OtherProperty .