Sont “{Binding Path=.}” et “{Binding}” vraiment égal
Dans mon projet WPF, j'ai une zone de liste qui affiche les éléments d'un List<string>
collection. Je voulais rendre le texte de ces éléments modifiables, donc j'ai enveloppé de chacun d'eux dans un ItemTemplate avec une zone de texte (peut-être pas le meilleur moyen, mais je suis nouveau sur WPF). J'ai eu de la difficulté à lier simplement les zones de texte " Texte de la propriété à la valeur de chaque élément. Je me suis finalement tombé sur un exemple en utilisant un seul point ou de la période de son Chemin d'accès à la propriété ({Binding Path=.}
):
<ListBox ItemsSource="{Binding ElementName=recipesListbox,Path=SelectedItem.Steps}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=.}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Cependant je ne comprends pas pourquoi tout simplement à l'aide de {Binding}
n'a pas fonctionné.
Il a soulevé une "les Deux sens de la liaison nécessite Chemin ou XPath" exception, comme selon Microsoft:
[...] un point (.) chemin d'accès peut être utilisé pour lier à la source de courant. Par exemple, Text="{Binding}" est équivalent à Text="{Binding Path=.}"
Quelqu'un pourrait jeter la lumière sur ce comportement ambigu?
EDIT: en Outre, il semble {Binding Path=.}
ne donnent pas nécessairement une liaison bidirectionnelle, que de modifier le texte et en déplaçant le focus n'est pas de mise à jour de la source sous-jacent (de la même source a également des propriétés affichée et modifiée avec succès sur un contrôle DataGrid). Je suis définitivement manque quelque chose ici.
Vous devez vous connecter pour publier un commentaire.
Le point de l'exception sans doute, c'est que vous ne pouvez pas les deux sens de liaison d'une liaison-source elle-même, de sorte qu'il essaie de vous empêcher de créer une liaison qui ne se comportent pas de la façon dont vous le souhaitez. En utilisant
{Binding Path=.}
vous avez juste le truc de l'erreur de manipulation.(Aussi il n'est pas rare que la documentation est erronée ou inexacte, même si je n'aime pas la documentation MSDN beaucoup, en général, comme il le fait habituellement contenir les points essentiels, l'un est intéressé)
La documentation indique que les
{Binding}
est équivalent à{Binding Path=.}
. Toutefois, il est pas équivalent à{Binding Path}
que vous avez tapé. Si vous incluez lePath
de la propriété, vous devez l'affecter à quelque chose, que ce soitPath=.
ouPath=OtherProperty
.Ce ne sont pas les mêmes. Si vous liez cette où ConsoleMessages est une ObservableCollection chaîne avec {Binding} vous obtenez une "liaison bidirectionnelle nécessite Chemin ou XPath." l'exception " où, comme {Binding Path=.} des œuvres. C'est avec WPF 4.0...
Mon 2p vaut la peine...
En bref, la différence entre les deux est analogue à la différence entre le traditionnel passage par valeur et le passage par référence. (ARY - Quelle est la différence entre le passage par référence vs passage par valeur?)
Supposons ici que pour l'instant
{Binding}
peut être utilisé pour une liaison bidirectionnelle. En général{Binding}
crée une valeur en fonction de lien avec datacontext qui ne permet pas la mise à jour du datacontext.Alors que
{Binding Path=.}
crée de référence lien avec la zone de mémoire référencée par la "Voie" qui permet de mettre à jour la valeur par référence.(dans ce cas, dot le datacontext).Espérons que cette aide!