首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >{Binding PropertyName}与{Binding Path=PropertyName}的区别

{Binding PropertyName}与{Binding Path=PropertyName}的区别
EN

Stack Overflow用户
提问于 2010-11-30 02:10:26
回答 5查看 12.8K关注 0票数 26

我见过在同一个项目中使用这两种样式,我想知道它们之间是否有语义上的差异,或者是否会推荐使用另一种样式,以及为什么。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-30 02:25:08

没有。

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

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

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

希望这能有所帮助。

票数 17
EN

Stack Overflow用户

发布于 2012-02-22 02:26:33

这里有一个很大的区别,一旦你有了一个带有类型化参数的复杂属性路径,你就会遇到这个问题。

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

在解析XAML时,type converters用于将字符串转换为属性所期望的类型。因此,当您使用Path=时,将实例化一个PropertyPathConverter来解析字符串并返回一个PropertyPath。下面是不同之处:

  • Binding(string path)调用public PropertyPath(string, Object[])
  • PropertyPathConverter调用internal PropertyPath(string, ITypeDescriptorContext)

(对于Binding构造函数,Object[]将为空)

这有什么关系呢?

例如,如果您有一个需要stringmultiple indexers in a class和一个需要int的and,而您试图将值强制转换为针对后者,则强制转换将不起作用:

代码语言:javascript
复制
{Binding [(sys:Int32)0]}

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

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

代码语言:javascript
复制
{Binding Path=[(sys:Int32)0]}

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

票数 50
EN

Stack Overflow用户

发布于 2010-11-30 05:50:01

它们的意思是一样的。它们的不同之处在于绑定对象的实例化和填充方式。

代码语言:javascript
复制
{Binding Path=Foo}

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

代码语言:javascript
复制
{Binding Foo}

使用其单参数构造函数创建绑定实例,并将值"Foo“传递给该构造函数参数。单参数构造函数只设置Path属性,这就是为什么这两种语法是等价的。

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

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4306657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档