“{绑定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)。
希望这可以帮助!