2010-11-29 6 views

答えて

13

ありません。

指定しない場合、Pathプロパティに値が割り当てられます。つまり、Pathはバインディングのデフォルトプロパティです。

これは、多くのコントロールのデフォルトプロパティである「コンテンツ」プロパティと似ています。例えば

<Button>Hello</Button>は役立ちます<Button><Button.Content><TextBlock Text="Hello"/></Button>

・ホープと同じです。

+7

表面的にはコンテンツプロパティと似ていますが、そのメカニズムはまったく異なります。コンテンツプロパティはContentPropertyAttributeのために機能します。 (Buttonの場合は、ContentControlの基底クラスから取得します)。この属性は、XamlにContentプロパティと同等であることを伝えます。しかしBindingでは、BindingがPathプロパティと同じことを行う1引数のコンストラクタを提供するため、単純に機能します。完全に異なるメカニズム - Joe Whiteの答えを参照してください。 –

+0

何か別のものでなければなりません。私は問題を横切ってパスを省略し、その後行動が変わった。私の場合、1つのプロジェクト{binding propertyname}を使用してプロパティを2方向に更新して正常に動作しました。しかし、私は同じビューモデルのバイナリを使用して別のプロジェクトに正確に同じxamlを入れましたが、バインディングが一方的に機能しているようです。この問題を解決するには、{binding path = propertyname、mode = twoway}を明示的に定義しなければなりません。 –

+0

私はH.B.を信じます。その答えに何か言及しました。結局、あなたがもっと明示的であれば、驚きは少なくなりますが、私はそれらの「ショートカット」が役に立ちます。 –

3

違いはないと思われますが、おそらく2番目の方が明白であると思います。

5

意味の違いはありません。プロパティ名が指定されていない場合、バインディングの最初のプロパティは "パス"プロパティとして解釈されます。

これはコーディングスタイルの問題です。

更新

文 "これはデフォルトプロパティである" を削除しました。

"デフォルトプロパティ"は正式サポートされていませんが、このシナリオはしばしば "デフォルトプロパティ"と呼ばれ、慣例によってサポートされています。

バインディングマークアップ拡張機能は、パスは=に必要としない概念「デフォルトプロパティ」としてBinding.Pathを使用する:バインディングマークアップ拡張のパスプロパティのMSDN documentationから

例、式に現れます。

私は間違っていて、この用語を使うのは間違っているとは思わない。私はそれがどのように実装されているかも理解しています

+0

実際にはコンストラクタパラメータです。マークアップ拡張のための「デフォルトプロパティ」はありません。 –

+0

@Joe確かに、それはデフォルトの動作\意味を持っています。それは条約です。 –

+0

はい、しかし、そのようなことがないので、用語「デフォルトプロパティ」を使用することは有益ではありません。そして、存在しない概念に依存する説明の問題は、人々が他の状況でその概念を試して適用することは義務であり、これは役に立たないということです。 (ArrayExtensionの「デフォルトプロパティ」には、1つの引数を持つ2つのコンストラクタが2つあります)。「デフォルトプロパティ」の文を削除するように編集して、実質的に改善することができます。 –

21

同じことを意味します。それらが異なるところは、Bindingオブジェクトがどのようにインスタンス化され、移入されるかです。

{Binding Path=Foo} 

は、パラメータのないコンストラクタを使用してBindingインスタンスを作成し、インスタンスのPathプロパティを設定します。

{Binding Foo} 

は、単一パラメータコンストラクタを使用してBindingインスタンスを作成し、そのコンストラクタパラメータに値 "Foo"を渡します。単一パラメータのコンストラクタはPathプロパティを設定するだけで、2つの構文が同じになる理由です。

カスタム属性の構文とよく似ています。コンストラクタパラメータを渡したり、プロパティ値を設定したりすることもできます。

+4

これは同等ではないコーナーケースがあることに興味があります。詳細は私の答えをご覧ください。 –

40

です。ここで重要な違いは、型付きパラメータを持つ複雑なプロパティパスを持つとすぐに実行されます。

概念的には、それらは両方ともBinding.Pathを設定し、いずれもparameterized Binding constructorで、もう1つはプロパティを介して直接設定するため、同等です。 Binding.Pathはどちらの場合もプロパティに渡される文字列ではなく、Binding.Pathが内部で発生するものは非常に異なります。PropertyPathです。

XAMLが解析されるとき、type convertersは、文字列をプロパティによって予想される型に変換するために使用されます。したがって、Path=を使用するとPropertyPathConverterがインスタンス化され、文字列を解析してPropertyPathを返します。今、ここでの違いは次のとおりです。

Object[]が空になりますBindingコンストラクタの場合)

を呼び出します問題?

たとえば、multiple indexers in a classの場合は、パブリックコンストラクタはタイプので、呼び出されているためPropertyPathITypeDescriptorContextを欠いている

{Binding [(sys:Int32)0]} 

stringintを期待して、キャストが動作しません後者をターゲットに値をキャストしようとするものを期待する1 System.Int32は文字列sys:Int32から解決できません。

あなたがPath=を使用している場合しかし、型コンバータが代わりに使用されますと型は、コンテキストを使用して解決されますので、これは動作します:

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

は(実装の詳細楽しいませんか?)

+0

洞察力のあるありがとう! –

+1

@DiegoMijelshon:あなたは歓迎ですが、ジョーホワイトの答えを受け入れることをお勧めします。受け入れられたものは2つの漠然としています。ほとんどの実用的な目的のために、ホワイトの答えは私が最も正しいと考えるものです。 (私ももちろん受け入れてもらえませんか) –

+0

誰も何時間も別の人に来なかったので、私はそれを受け入れました:-) 実際に他の人をテストせずに受け入れられた答えを変更するのは公正ではありませんこれは15ヶ月前です。 –