"{Binding Path =.}"和"{Binding}"是否真的相等

Fue*_*led 46 wpf xaml binding 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>
Run Code Online (Sandbox Code Playgroud)

但是我不明白为什么单纯使用{Binding}不起作用.

根据微软的说法,它提出了" 双向绑定需要Path或XPath "的例外情况:

[...]句点(.)路径可用于绑定到当前源.例如,Text ="{Binding}"等同于Text ="{Binding Path =.}"

有人可以阐明这种模棱两可的行为吗?

编辑:此外,它似乎{Binding Path=.}不一定提供双向绑定,因为修改文本和移动焦点不会更新底层源(相同的源也具有在DataGrid控件上显示和成功修改的属性).我肯定在这里遗漏了一些东西.

H.B*_*.B. 27

异常的重点可能是你不能双向绑定绑定源本身,所以它试图阻止你创建一个不按你想要的方式运行的绑定.通过使用{Binding Path=.}你只需欺骗错误处理.

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

  • +1:这是正确的答案.[我刚遇到](http://stackoverflow.com/a/13089160/149265)这个现象我自己. (4认同)

cey*_*yko 21

文档陈述{Binding}相当于{Binding Path=.}.但它并不等同于{Binding Path}您输入的内容.如果您包含该Path属性,则必须将其分配给某个内容,无论是Path=.Path=OtherProperty.

  • 那是一个错字,现在已经修好了. (3认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

我的2p价值......


小智 5

简而言之,两者之间的差异类似于传统的按值传递与按引用传递之间的差异。(FYR - 有什么引用传递与按值传递的区别?

但是我不明白为什么简单地使用{Binding}不起作用(它引发了“双向绑定需要Path或XPath”异常)

现在让我们假设这里{Binding}可以用于双向绑定。通常,{Binding}使用数据上下文创建基于值的链接,该链接不允许更新数据上下文。

{Binding Path=.}使用“路径”所引用的存储区创建基于引用的链接,该链接允许通过引用来更新值(在这种情况下,“点”当前数据上下文)。

希望这可以帮助!