在我的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 ”例外,according to Microsoft:
[...]句点(。)路径可用于绑定到当前源。例如,Text =“{Binding}”相当于Text =“{Binding Path =。}”
有人可以阐明这种模棱两可的行为吗?
编辑:此外,似乎{Binding Path=.}
不一定会提供双向绑定,因为修改文本和移动焦点不会更新基础源(相同的源也有在DataGrid控件上显示并成功修改的属性)。我肯定在这里遗漏了一些东西。
答案 0 :(得分:27)
异常的重点可能是你不能双向绑定绑定源本身,所以它试图阻止你创建一个不按你想要的方式运行的绑定。通过使用{Binding Path=.}
,您只需欺骗错误处理。
(也不是闻所未闻的文档是错误的或不准确的,尽管我一般都非常喜欢MSDN文档,因为它通常包含一个人感兴趣的关键点)
答案 1 :(得分:20)
文档指出{Binding}
等同于{Binding Path=.}
。但是,您输入的不等同于{Binding Path}
。如果您包含Path
属性,则必须将其分配给某些内容,无论是Path=.
还是Path=OtherProperty
。
答案 2 :(得分:7)
这些不一样。如果你绑定了这个,那么ConsoleMessages是一个只有{Binding}的ObservableCollection字符串,你得到一个“双向绑定需要Path或XPath”。 {Binding Path =。}有效的异常。这是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值得......
答案 3 :(得分:4)
简而言之,两者之间的差异类似于传统的按值传递和传递参考之间的差异。 (FYR - What's the difference between passing by reference vs. passing by value?)
但是我不明白为什么简单地使用{Binding}没有工作(它提出了一个&#34;双向绑定需要Path或XPath&#34;异常)
现在让我们假设{Binding}
可以用于双向绑定。通常,{Binding}
使用datacontext创建基于值的链接,该链接不允许更新datacontext。
{Binding Path=.}
创建基于参考的链接,其中包含&#39;路径&#39;引用的内存区域。允许通过引用更新值。(在这种情况下,&#39; dot&#39;当前的datacontext)。
希望这有帮助!