2010-11-29 7 views

Répondre

13

Il n'y en a pas.

Lorsqu'elle n'est pas spécifiée, la propriété Path est associée à la valeur. En d'autres termes, Path est la propriété par défaut d'une liaison.

C'est comme la propriété "Content", qui est la propriété par défaut pour de nombreux contrôles. Par exemple

<Button>Hello</Button> est le même que <Button><Button.Content><TextBlock Text="Hello"/></Button>

espoir qui aide.

+7

Bien que ce soit superficiellement similaire aux propriétés de contenu, le mécanisme est totalement différent. Les propriétés de contenu fonctionnent à cause de ContentPropertyAttribute. (Dans le cas de Button, cela provient de la classe de base ContentControl.) Cet attribut indique à Xaml que le contenu est équivalent à la propriété Content. Mais avec Binding, cela fonctionne simplement parce que Binding offre un constructeur à un argument qui arrive à faire la même chose que la propriété Path. Mécanisme totalement différent - voir la réponse de Joe White. –

+0

Il doit y avoir quelque chose de différent. Je suis tombé sur un problème avec omettre le chemin, puis le comportement a été changé. Dans mon cas, un projet que j'ai utilisé {liaison propertyname} alors la mise à jour de la propriété bidirectionnelle et fonctionne bien. Cependant, je mets exactement le même xaml à un autre projet en utilisant le même binaire modèle de vue, mais il semble que la liaison fonctionne d'une manière. Pour résoudre ce problème, je dois explicitement définir {binding path = propertyname, mode = twoway} et ensuite ça marche bien. –

+0

Je crois que H.B. mentionné quelque chose à ce sujet dans la réponse. En fin de compte, si vous êtes plus explicite, vous aurez moins de surprises, mais je trouve ces raccourcis utiles. –

3

Ne pensez pas qu'il y a une différence, attendez peut-être que la seconde soit plus explicite.

5

Il n'y a pas de différence sémantique, la première propriété de la liaison sera interprétée comme la propriété "Path" si aucun nom de propriété n'est fourni.

C'est une question de style de codage.

Mise à jour

Suppression de la phrase: "Il est la propriété par défaut".

Je réalise qu'il n'y a pas de support formel pour les "propriétés par défaut", mais le scénario est souvent appelé la "propriété par défaut", et est supporté par la convention.

Exemple, à partir du MSDN documentation pour la propriété Chemin de l'extension de balisage Reliure:

L'extension de balisage liaison utilise Binding.Path comme une « propriété par défaut » conceptuel, où Path = n'a pas besoin de apparaître dans l'expression.

Je ne pense pas que je me trompe et complètement erroné d'utiliser cette terminologie comme cela est suggéré. Je comprends également comment il est mis en œuvre.

+0

C'est en fait un paramètre constructeur. Il n'y a pas de "propriété par défaut" pour les extensions de balisage. –

+0

@Joe Bien sûr, il a un comportement par défaut \ sens. C'est une convention. –

+0

Oui, mais il n'est pas utile d'utiliser le terme "la propriété par défaut" car il n'y en a pas.Et le problème avec une explication qui dépend d'un concept inexistant, c'est que les gens sont susceptibles d'essayer et d'appliquer ce concept dans d'autres situations, ce qui ne va pas être utile. (Quelle est la 'propriété par défaut' de ArrayExtension? Qui a deux constructeurs 1-arg!) Vous pourriez améliorer votre réponse substantiellement en l'éditant pour enlever cette phrase "C'est la propriété par défaut". –

21

Ils veulent dire la même chose. Où ils diffèrent est dans la façon dont l'objet Binding est instancié et peuplé.

{Binding Path=Foo} 

crée une instance de liaison à l'aide de son constructeur sans paramètre, puis définit la propriété Path de l'instance.

{Binding Foo} 

crée une instance de liaison en utilisant son constructeur unique paramètre, et passe la valeur « Foo » à ce paramètre constructeur. Le constructeur à un seul paramètre définit simplement la propriété Path, ce qui explique pourquoi les deux syntaxes sont équivalentes.

Cela ressemble beaucoup à la syntaxe des attributs personnalisés, où vous pouvez également passer des paramètres de constructeur et/ou définir des valeurs de propriété.

+4

Il pourrait être intéressant pour vous qu'il existe des cas d'angle où ils ne sont pas équivalents, voir ma réponse pour plus de détails. –

40

est une différence significative ici que vous rencontrerez dès que vous avez un chemin de propriété complexe avec des paramètres typés.

D'un point de vue conceptuel, ils sont équivalents puisqu'ils finissent tous deux par définir le Binding.Path, l'un via le parameterized Binding constructor, l'autre directement via la propriété. Ce qui se passe est très différent en interne mais que le Binding.Path est non seulement une chaîne qui dans les deux cas seraient transmis à la propriété, il est PropertyPath.

Lorsque XAML est analysé type converters sont utilisés pour transformer les chaînes dans les types attendus par les propriétés. Ainsi, lorsque vous utilisez un Path=PropertyPathConverter sera instancié pour analyser la chaîne et retourner un PropertyPath. Maintenant, voici la différence:

(Dans le cas du constructeur Binding la Object[] sera vide)

Comment est-ce si matière?

Si par exemple vous avez par exemple multiple indexers in a class qui attend un string et qui attend un int et vous essayez de jeter la valeur pour cibler ce dernier le casting ne fonctionnera pas:

{Binding [(sys:Int32)0]} 

Le PropertyPath fait défaut le ITypeDescriptorContext parce que le constructeur public est invoqué le type System.Int32 ne peut pas être résolu à partir de la chaîne sys:Int32.

Si vous utilisez Path= mais le convertisseur de type sera utilisé à la place et le type sera résolu en utilisant le contexte, donc cela va fonctionner:

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

(Ne sont pas les détails de mise en œuvre fun?)

+0

Perspicace. Merci! –

+1

@DiegoMijelshon: De rien, je vous suggère d'accepter la réponse de Joe White, cependant, la réponse acceptée est deux vagues, comme indiqué dans le commentaire. Pour la plupart des objectifs pratiques, la réponse de White est celle que je pense être la plus correcte. (Cela ne me dérangerait pas si vous acceptez le mien bien sûr) –

+0

Je l'ai accepté parce que personne n'est venu avec un autre pendant plusieurs heures :-) Il ne serait pas juste de changer la réponse acceptée sans réellement tester les autres - gardez à l'esprit c'était il y a 15 mois. –