1

谁能解释为什么在设置绑定时,有时您会在绑定路径周围加上引号 -

<myObject.myProperty>
    <Binding Path="myData" />
<myObject.myProperty/>

有时没有——

<myObject myProperty="{Binding Path=myData}" />

?

微软(http://msdn.microsoft.com/en-us/library/ms752059.aspx#xaml_syntax_in_brief)状态 -

"An attribute syntax names the property that is 
 being set in attribute syntax, followed by the 
 assignment operator (=). The value of an attribute 
 is always specified as a string that is contained
 within quotation marks."

但是这里我们总是在不带引号的情况下指定 Binding 元素的 Path 属性。我不了解 {} 语法吗?

4

1 回答 1

2

这不是数据绑定本身的特性。这同样适用于任何标记扩展。例如,您描述的引号/无引号变体也可以通过StaticResource标记扩展找到,如本示例所示:

<StackPanel>
    <StackPanel.Resources>
        <SolidColorBrush x:Key="b" Color="Red" />
    </StackPanel.Resources>

    <TextBlock
        Foreground="{StaticResource b}"
        Text="Foo"/>
    <TextBlock
        Text="Foo">
        <TextBlock.Foreground>
            <StaticResource ResourceKey="b" />
        </TextBlock.Foreground>
    </TextBlock>
</StackPanel>

归结为:如果您使用 XML 元素来实例化标记扩展(例如Bindingor StaticResource)并且如果您将属性设置为属性,则 XML 的语法规则需要引号。这不在 XAML 的控制范围内 - XML 语法要求所有属性值都用引号引起来。

但是,如果您使用标记语法扩展(即 {...}),引号对于您在这些大括号内设置的属性是可选的。这是因为标记扩展语法不是 XML 的特性。这是 XAML 的一项功能,因此 Microsoft 可以控制语法。标记扩展的一个目标是减少冗长,并且由于 Microsoft 可以将引号设为可选,因此他们这样做了。(事实上​​,需要引号会很麻烦,因为这样您就容易陷入转义问题 - 当标记扩展是属性的值时,它已经用引号括起来了,因此需要嵌套引号可能会变得很混乱。)

顺便说一句,还有第三种语法:

<myObject.myProperty>
    <Binding>
        <Binding.Path>myData</Binding.Path>
    </Binding>
<myObject.myProperty/>

ABinding与 XAML 中的任何其他对象一样只是一个对象,因此您可以使用属性或属性元素设置其属性。通过设置Path为属性元素,我可以将其值作为该属性元素的内容提供。XML 语法规则不需要在元素内容周围加上引号,因此我再次省略了引号。

所以这一切都归结为 XML 的数据需要引用的规则。它与 XAML 没有太大关系,并且完全不特定于数据绑定。

于 2013-04-01T08:02:23.920 回答