我已经看到同一个项目中使用了这两种样式,我想知道它们之间是否有任何语义差异,或者是否会推荐其他样式和原因。
答案 0 :(得分:45)
这里有一个显着的区别,只要你有一个带有类型参数的复杂属性路径,你就会遇到它。
在概念上它们是等效的,因为它们最终都通过Binding.Path
设置parameterized Binding
constructor,另一个直接通过属性设置。PropertyPath
。内部发生的事情是非常不同的,因为Binding.Path
不仅仅是一个字符串,在两种情况下都会传递给属性,它是type converters。
解析XAML时,PropertyPathConverter
用于将字符串转换为属性所需的类型。因此,当您使用Path=
时,将Binding(string path)
实例化以解析字符串并返回PropertyPath
。现在有不同之处:
public PropertyPath(string, Object[])
调用PropertyPathConverter
internal PropertyPath(string, ITypeDescriptorContext)
(如果是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)
不要认为存在任何差异,预计第二种可能更明确。