1

バインディングを設定するときに、バインディングパスを引用符で囲んで行うことがある理由を誰でも説明できますか-

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

そして時にはなしで -

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

?

Microsoft ( 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 要素を使用してマークアップ拡張機能 (Bindingまたは などStaticResource) をインスタンス化し、プロパティを属性として設定する場合、XML の構文規則では引用符が必要になります。これは XAML の制御外です。XML 構文では、すべての属性値を引用符で囲む必要があります。

ただし、マークアップ構文の拡張機能 ({...} など) を使用する場合、中括弧内に設定するプロパティの引用符はオプションです。これは、マークアップ拡張構文が XML の機能ではないためです。これは XAML の機能であるため、Microsoft が構文を制御しています。マークアップ拡張機能の 1 つの目標は、冗長性を減らすことです。Microsoft は引用符をオプションにすることができたので、そうしました。(実際、引用符を必須にするのは面倒です。なぜなら、エスケープの問題に陥る傾向があるためです。マークアップ拡張機能が属性の値である場合、それは既に引用符で囲まれているため、ネストされた引用符を必須にするのは面倒です。)

ちなみに、3 番目の構文があります。

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

ABindingは、XAML の他のオブジェクトと同様に単なるオブジェクトであるため、属性またはプロパティ要素を使用してそのプロパティを設定できます。プロパティ要素として設定Pathすることで、その値をそのプロパティ要素のコンテンツとして提供できます。XML 構文規則では、要素の内容を引用符で囲む必要がないため、ここでも引用符を省略しています。

したがって、すべては、データに引用符が必要な場所に関する XML のルールに帰着します。XAML とはあまり関係がなく、データ バインディングに固有のものでもありません。

于 2013-04-01T08:02:23.920 に答える