我已经看到在同一个项目中使用了这两种样式,我想知道它们之间是否有任何语义差异,或者是否会推荐其他样式以及为什么.
H.B*_*.B. 45
还有就是这里显著差异,你会遇到,只要你有输入参数的复杂属性路径.
在概念上它们是等价的,因为它们最终都Binding.Path通过参数化Binding构造函数设置,一个直接通过属性设置.内部发生的事情是非常不同的,因为Binding.Path它不仅仅是一个字符串,在两种情况下都会传递给属性,它是一个PropertyPath.
解析XAML时,类型转换器用于将字符串转换为属性所需的类型.所以当你使用Path=一个PropertyPathConverter将被实例化来解析字符串并返回一个PropertyPath.现在有不同之处:
Binding(string path) 所调用 public PropertyPath(string, Object[])PropertyPathConverter 所调用 internal PropertyPath(string, ITypeDescriptorContext)(在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)
(实现细节不是很有趣吗?)
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属性,这就是两个语法相同的原因.
它非常类似于自定义属性的语法,您还可以在其中传递构造函数参数和/或设置属性值.
Dav*_*lle 16
空无一人.
未指定时,将为Path属性分配值.换句话说,Path是绑定的默认属性.
它就像"Content"属性,它是许多控件的默认属性.例如
<Button>Hello</Button> 是相同的 <Button><Button.Content><TextBlock Text="Hello"/></Button>
希望有所帮助.