【问题标题】:Simple WPF Databinding syntax for 'Path' property“路径”属性的简单 WPF 数据绑定语法
【发布时间】:2013-03-22 07:20:52
【问题描述】:

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

<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属性。我是不是不太了解 {} 语法?

【问题讨论】:

    标签: wpf data-binding binding syntax path


    【解决方案1】:

    这不是数据绑定的特性本身。这同样适用于任何标记扩展。例如,您描述的引号/无引号变体也可以通过 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 元素来实例化标记扩展(例如 BindingStaticResource)并且如果您将属性设置为属性,则 XML 的语法规则需要引号。这不在 XAML 的控制范围内 - XML 语法要求所有属性值都用引号引起来。

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

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

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

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

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

    【讨论】:

    • 简洁的答案,非常容易理解。非常感谢!
    • 谢谢 - 很高兴你喜欢它。您有机会将其标记为答案吗?
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 2010-11-01
    • 2011-04-04
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多