{Binding PropertyName}和{Binding Path = PropertyName}之间的区别

Die*_*hon 21 wpf xaml binding

我已经看到在同一个项目中使用了这两种样式,我想知道它们之间是否有任何语义差异,或者是否会推荐其他样式以及为什么.

H.B*_*.B. 45

还有就是这里显著差异,你会遇到,只要你有输入参数的复杂属性路径.

在概念上它们是等价的,因为它们最终都Binding.Path通过参数化Binding构造函数设置,一个直接通过属性设置.内部发生的事情是非常不同的,因为Binding.Path它不仅仅是一个字符串,在两种情况下都会传递给属性,它是一个PropertyPath.

解析XAML时,类型转换器用于将字符串转换为属性所需的类型.所以当你使用Path=一个PropertyPathConverter将被实例化来解析字符串并返回一个PropertyPath.现在有不同之处:

(在Binding构造函数的情况下,Object[]将为空)

这有什么关系?

例如,如果您在一个类中多个索引器,例如一个期望a string和一个期望a的索引器,int并且您尝试将该值转换为目标后者,那么转换将不起作用:

{Binding [(sys:Int32)0]}
Run Code Online (Sandbox Code Playgroud)

PropertyPath缺少了ITypeDescriptorContext因公构造函数被调用,因此类型System.Int32不能从字符串来解决sys:Int32.

Path=但是,如果您使用,则将使用类型转换器,并且将使用上下文解析类型,因此这将起作用:

{Binding Path=[(sys:Int32)0]}
Run Code Online (Sandbox Code Playgroud)

(实现细节不是很有趣吗?)

  • @DiegoMijelshon:嗯,没有规则说你需要快速接受答案,我常常在没有接受答案的情况下离开我的问题,除非很明显.然而,这是一个基于知识的问题,并且接受的答案至少具有误导性,甚至没有提到一种方法使用构造函数.这是你的问题,你可以自由地接受任何你想要的东西,毕竟仍然有最高分确定的"社区接受"答案. (3认同)

Joe*_*ite 23

他们的意思是一样的.它们的不同之处在于如何实例化和填充Binding对象.

{Binding Path=Foo}
Run Code Online (Sandbox Code Playgroud)

使用其无参数构造函数创建Binding实例,然后设置实例的Path属性.

{Binding Foo}
Run Code Online (Sandbox Code Playgroud)

使用其单参数构造函数创建Binding实例,并将值"Foo"传递给该构造函数参数.单参数构造函数只设置Path属性,这就是两个语法相同的原因.

它非常类似于自定义属性的语法,您还可以在其中传递构造函数参数和/或设置属性值.

  • 您可能会感兴趣的是,有些情况下它们并不相同,请参阅我的答案以获取详细信息. (4认同)

Dav*_*lle 16

空无一人.

未指定时,将为Path属性分配值.换句话说,Path是绑定的默认属性.

它就像"Content"属性,它是许多控件的默认属性.例如

<Button>Hello</Button> 是相同的 <Button><Button.Content><TextBlock Text="Hello"/></Button>

希望有所帮助.

  • 虽然它表面上看起来像内容属性,但机制完全不同.内容属性因ContentPropertyAttribute而起作用.(对于Button,它来自ContentControl基类.)该属性告诉Xaml内容等同于Content属性.但是使用Binding,它只是因为Binding提供了一个1参数构造函数,它恰好与Path属性做同样的事情.完全不同的机制 - 见Joe White的回答. (7认同)

Tim*_*oyd 5

没有语义差异,如果没有提供属性名称,绑定中的第一个属性将被解释为"Path"属性.

这是编码风格的问题.

更新

删除了句子"这是默认属性".

我意识到没有对"默认属性"的正式支持,但是该场景通常被称为"默认属性",并且受到约定的支持.

例如,来自Binding标记扩展的Path属性的MSDN文档:

Binding标记扩展使用Binding.Path作为概念性"默认属性",其中Path =不需要出现在表达式中.

我不认为我错了,完全误导使用这个术语正如所暗示的那样.我也理解它是如何实现的.