“{绑定path=。}”和“{绑定}”是否真的相等

在我的WPF项目中,我有一个ListBox来显示List<string>集合中的项目。 我想让这些项目的文本是可编辑的,所以我用TextBox将它们包装在ItemTemplate中(可能不是最好的方法,但我是WPF的新手)。 我只是简单地将TextBoxes的Text属性绑定到每个项目的值。 我终于偶然发现了一个使用单个点或句点作为Path属性( {Binding Path=.} )的例子:

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

不过,我不明白为什么简单地使用{Binding}不起作用。

它提出了一个“ 双向绑定需要Path或XPath ”的例外,正如微软所说:

(。)path可用于绑定到当前源。 例如,Text =“{Binding}”相当于Text =“{Binding Path =。}”

有人能揭示这种模棱两可的行为吗?

编辑:此外,似乎{Binding Path=.}不一定提供双向绑定,因为修改文本和移动焦点不会更新基础源(同一个源也有属性显示,并成功修改DataGrid控件)。 我肯定在这里错过了一些东西。

这个exception的意义大概是你不能双向绑定一个绑定源本身,所以它试图阻止你创build一个不符合你想要的绑定。 通过使用{Binding Path=.}你只是欺骗error handling。

(这也是闻所未闻的文档是错误的或不准确的,虽然我喜欢MSDN文档一般很多,因为它通常包含人们感兴趣的关键点)

该文档指出{Binding}等同于{Binding Path=.} 。 但是,它与input的{Binding Path} 。 如果包含Path属性,则必须将其分配给Path=. 或者Path=OtherProperty

这些是不一样的。 如果您将ConsoleMessages与ObservableCollectionstring绑定在一起,只需{Binding}即可获得“双向绑定需要Path或XPath”。 作为{绑定path=。}的exception。 这是与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> 

我的2p值得…

总之,两者的区别在于传统的价值传递与传递的差异。 (FYR – 通过引用与按价值传递之间的区别是什么? )

然而,我不明白为什么简单地使用{绑定}不起作用(它引发了“双向绑定需要path或XPath”exception)

现在让我们假设{Binding}可以用于双向绑定。 通常{Binding}创build一个基于值的链接,其中datacontext不允许更新datacontext。

{Binding Path=.}创build基于引用的链接与'path'引用的内存区域,允许通过引用更新值(在这种情况下'点'当前datacontext)。

希望这可以帮助!