“{Binding Path =。}”和“{Binding}”是否真的相等

时间:2011-03-30 14:54:55

标签: 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>

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

它引发了一个“双向绑定需要Path或XPath ”例外,according to Microsoft

  

[...]句点(。)路径可用于绑定到当前源。例如,Text =“{Binding}”相当于Text =“{Binding Path =。}”

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

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

4 个答案:

答案 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)。

希望这有帮助!