J'ai vu les deux styles utilisés dans le même projet, et je me demande s'il y a une différence sémantique entre eux, ou si l'un serait recommandé par rapport à l'autre et pourquoi .Différence entre {Binding PropertyName} et {Binding Path = PropertyName}
Répondre
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.
Ne pensez pas qu'il y a une différence, attendez peut-être que la seconde soit plus explicite.
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.
C'est en fait un paramètre constructeur. Il n'y a pas de "propriété par défaut" pour les extensions de balisage. –
@Joe Bien sûr, il a un comportement par défaut \ sens. C'est une convention. –
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". –
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é.
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. –
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:
Binding(string path)
invoquepublic PropertyPath(string, Object[])
PropertyPathConverter
invoqueinternal PropertyPath(string, ITypeDescriptorContext)
(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?)
Perspicace. Merci! –
@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) –
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. –
- 1. Différences entre page ["propertyName"] et page.property ["propertyName"] dans EPiServer?
- 2. get_PropertyName()/set_PropertyName() vs PropertyName?
- 3. WPF Binding Path =/ne fonctionne pas?
- 4. Liaison PropertyName de CollectionViewSource SortDescription dans Xaml
- 5. WPF - Obtenir PropertyName dans IValueConverter
- 6. Silverlight MVVM Combobox Binding se
- 7. Silverlight MVVM Combobox Binding se
- 8. Binding StringFormat
- 9. DataGridView Binding
- 10. C# MVVM DataGrid Binding Strategies?
- 11. WPF Binding Help
- 12. TemplatedParent Binding dans ControlTemplate.Triggers
- 13. WPF Canvas Binding
- 14. WPF ListBox Binding ItemsSource
- 15. WPF TreeView Binding
- 16. WPF TreeView Binding
- 17. WPF CustomControl et Image binding
- 18. Silverlight 4 et Page.Resources Binding
- 19. WPF Dynamic Binding
- 20. ItemsControl MVVM Binding
- 21. Wpf Recursive Binding
- 22. WPF Tooltip Binding
- 23. WPF binding Ancêtre
- 24. ASP.Net MVC Model Binding
- 25. Adresses IP JBoss Binding
- 26. WCF TCP Binding
- 27. Java XML Binding
- 28. WPF Binding Alternatives/Améliorations
- 29. jQuery Binding Malheurs
- 30. Swing data binding frameworks
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. –
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. –
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. –