2009-03-10 18 views
12

Quelles sont les différences entre faire un autoréférentiel de liaison via un nom et un autoréférentiel via RelativeSource?Différences entre ElementName = "<Me>" et RelativeSource self?

Par exemple:

<!-- Self referential via name --> 
<Window ... 
    x:Name="This" 
    DataContext="{Binding Path=Data, ElementName=This}"/> 

contre

<!-- Self referential via RelativeSource --> 
<Window ... 
    x:Name="This" 
    DataContext="{Binding Path=Data, RelativeSource={RelativeSource Self}}"/> 

Dans mon projet, ils semblent se comporter de manière identique, mais je les utiliser directement dans une fenêtre. Cela signifie que je préfère immédiatement le premier parce que c'est moins typé.

Est-ce que le seul avantage de RelativeSource est sa capacité à être autoréférentiel dans (par exemple) un style largement utilisé? Ou y a-t-il une différence sémantique supplémentaire?

Répondre

8

caveat: Pas sorcier WPF

Lorsque vous liez directement sur un élément WPF comme dans votre exemple il n'y a pas de différence. "Ceci" est résolvable et se liera au même objet que le Soi. Je soupçonne que la différence réside dans le fait que vous vous liez via des constructions telles que Style. Dans ce cas, ce que vous voulez réellement lier est l'élément auquel le style est appliqué. Dans ce cas, RelativeSource Self vous donnera cet élément où "this" vous donnera simplement une instance de Style.

+1

Ce fut la seule chose que je pouvais penser ou trouver, aussi. J'ai rencontré beaucoup d'autres questions concernant WPF où j'ai manqué des infos, donc je voulais voir si quelqu'un d'autre avait quelque chose à ce sujet. Merci, Jared. :) –

-1

Pourquoi pensez-vous qu'il existe une différence entre eux? Je pense qu'ils devraient être identiques, car ils sont deux façons de se référer au même élément.

+0

'Je pense' et 'devrait' ne constitue pas une réponse. Envisagez d'évaluer comment chaque méthode résout la cible et les scénarios susceptibles de provoquer des différences. Voir la réponse de JaredPar. – Gusdor

2

Si vous avez tendance à refactoriser beaucoup les noms de vos contrôles, alors utiliser la forme auto-réfringente peut être plus souhaitable sinon je dirais que c'est un appel que je ferais en fonction de la performance. Construire un petit test et voir quel type de liaison fonctionne mieux et choisir celui-là. Si la différence de performance est négligeable alors je prendrais certainement en considération d'autres considérations de maintenabilité telles que l'apparence générale et le temps de taper. N'oubliez pas non plus, lorsque vous utilisez le formulaire auto-référentiel, vous n'avez pas besoin de nommer votre élément. Vous devez donc inclure cette exigence de dénomination supplémentaire pour le formulaire ElementName lorsque vous comparez la saisie et le changement de contexte entre la souris et le clavier. Personnellement, je préfère les formes de liaison référentielle quand cela est utile à des fins de refactorisation plus facile et le fait que je n'ai pas à déplacer mon document XAML pour ajouter un nom d'élément lorsque j'installe la liaison.