代码之家  ›  专栏  ›  技术社区  ›  Diego Mijelshon

绑定属性名和绑定路径之间的差异=属性名

  •  19
  • Diego Mijelshon  · 技术社区  · 15 年前

    我在同一个项目中看到了这两种样式,我想知道它们之间是否存在语义差异,或者是否有任何一种样式比另一种样式更受推荐,以及为什么。

    5 回复  |  直到 9 年前
        1
  •  15
  •   David Brunelle    15 年前

    没有。

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

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

    <Button>Hello</Button> 是一样的 <Button><Button.Content><TextBlock Text="Hello"/></Button>

    希望有帮助。

        2
  •  45
  •   Community Mohan Dere    9 年前

    那里 这里有一个显著的区别,当您有一个带有类型化参数的复杂属性路径时,您将很快遇到它。

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

    分析XAML时 type converters 用于将字符串转换为属性所需的类型。所以当你使用 Path= PropertyPathConverter 将被实例化以分析字符串并返回 属性路径 . 现在的区别是:

    (如果是 结合 构造函数 Object[] 将是空的)

    这有什么关系?

    例如,如果你 multiple indexers in a class 例如,期望 string 以及期望 int 你试着把价值投射到后者身上,投射就不起作用了:

    {Binding [(sys:Int32)0]}
    

    这个 属性路径 缺乏 ITypeDescriptorContext 因为调用了公共构造函数,所以 System.Int32 无法从字符串中解析 sys:Int32 .

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

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

    (不是实现细节 乐趣 ?)

        3
  •  23
  •   Joe White    15 年前

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

    {Binding Path=Foo}
    

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

    {Binding Foo}
    

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

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

        4
  •  5
  •   Tim Lloyd    15 年前

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

    这是一个编码风格的问题。

    更新

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

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

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

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

    我不认为我是错的,完全错误地按照建议使用这个术语。我也理解它是如何实现的。

        5
  •  3
  •   cristobalito    15 年前

    别以为有什么区别,也许第二个比较明确。

    推荐文章