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

时间:2010-11-29 18:10:26

标签: wpf xaml binding

我已经看到同一个项目中使用了这两种样式,我想知道它们之间是否有任何语义差异,或者是否会推荐其他样式和原因。

5 个答案:

答案 0 :(得分:45)

这里有一个显着的区别,只要你有一个带有类型参数的复杂属性路径,你就会遇到它。

在概念上它们是等效的,因为它们最终都通过Binding.Path设置parameterized Binding constructor,另一个直接通过属性设置。PropertyPath。内部发生的事情是非常不同的,因为Binding.Path不仅仅是一个字符串,在两种情况下都会传递给属性,它是type converters

解析XAML时,PropertyPathConverter用于将字符串转换为属性所需的类型。因此,当您使用Path=时,将Binding(string path)实例化以解析字符串并返回PropertyPath。现在有不同之处:

(如果是Binding构造函数,Object[]将为空)

这有什么关系?

例如,如果您有{{3}},例如一个期望string和一个期望int的人,并且你试图将该值转换为目标,后者的演员阵容将不起作用:

{Binding [(sys:Int32)0]}

PropertyPath缺少ITypeDescriptorContext,因为调用了公共构造函数,因此无法从字符串System.Int32解析类型sys:Int32

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

{Binding Path=[(sys:Int32)0]}

(不是实施细节有趣?)

答案 1 :(得分:23)

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

{Binding Path=Foo}

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

{Binding Foo}

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

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

答案 2 :(得分:15)

没有。

如果未指定,则为Path属性分配值。换句话说,Path是绑定的默认属性。

它类似于“Content”属性,它是许多控件的默认属性。例如

<Button>Hello</Button><Button><Button.Content><TextBlock Text="Hello"/></Button>

相同

希望有所帮助。

答案 3 :(得分:5)

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

这是编码风格的问题。

<强>更新

删除了句子“这是默认属性”。

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

示例,来自绑定标记扩展名的Path属性的MSDN documentation

  

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

我不认为我错了,并且完全误导使用这个术语,正如所建议的那样。我也理解它是如何实现的。

答案 4 :(得分:3)

不要认为存在任何差异,预计第二种可能更明确。