web-dev-qa-db-fra.com

Quelle est la différence entre x: Reference et ElementName?

Selon la page x: Reference Markup Extension sur MSDN, x:Reference

Référence une instance déclarée ailleurs dans le balisage XAML. La référence fait référence à l'élément x: Name.

Selon la propriété Binding.ElementName, propriété page sur MSDN, ElementName

La valeur de la propriété Name ou de la directive x: Name de l'élément d'intérêt.

En regardant les remarques sur la première page:

x: référence et WPF

Dans WPF et XAML 2006, les références aux éléments sont traitées par la fonctionnalité de niveau cadre de la liaison ElementName. Pour la plupart des applications et scénarios WPF, la liaison ElementName doit toujours être utilisée. Les exceptions à cette directive générale peuvent inclure des cas où il existe un contexte de données ou d'autres considérations de portée qui rendent la liaison de données impossible, et où la compilation de balises n'est pas impliquée.

Pour être complet, voici une partie de la section remarques de la page ElementName:

Cette propriété est utile lorsque vous souhaitez lier la propriété d’un autre élément de votre application. Par exemple, si vous souhaitez utiliser un curseur pour contrôler la hauteur d'un autre contrôle dans votre application ou si vous souhaitez lier le contenu de votre contrôle à la propriété SelectedValue de votre contrôle ListBox.

Maintenant, bien que je sache parfaitement quand et comment utiliser la propriété ElementName, je ne comprends pas tout à fait la différence entre celle-ci et l'extension de balisage x:Reference. Quelqu'un peut-il expliquer ceci et en particulier développer la dernière phrase de la section remarques x:Reference?

Les exceptions à cette directive générale peuvent inclure des cas où il existe un contexte de données ou d'autres considérations de portée qui rendent la liaison de données impossible, et où la compilation de balises n'est pas impliquée.

47
Sheridan

Fondamentalement, comme vous l'avez dit ces deux font presque la même chose. Cependant, il y a de petites différences sous le capot.

{x:Reference ...} -> ne renvoie que la référence d'un objet s'il ne crée pas ce "pont" entre deux propriétés comme le ferait une liaison. Derrière tout ce qui est utilisé, un service recherche le nom donné dans une étendue spécifique qui est généralement la fenêtre elle-même.

{Binding ElementName="..." } -> Tout d'abord, il crée cet objet de liaison, puis il recherche le nom de l'objet, mais pas en utilisant la même technique que x: Reference. L'algorithme de recherche monte et/ou descend dans VisualTree pour trouver l'élément souhaité. Par conséquent, un VisualTree fonctionnel est toujours nécessaire. Par exemple, lorsqu'il est utilisé à l'intérieur d'un non-UiElement, cela ne fonctionnera pas. À la fin, la reliure reste et fait son pain quotidien.

Cela ne fonctionnera pas:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/>
 ....

Cela marche:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/>
 ....

Un peu comme ça :)

58
dev hedgehog

ElementName est spécifique à la plate-forme. C'est à dire. il peut être ou ne pas être présent en fonction de la plate-forme que vous utilisez. x: Reference élève ce concept à une fonctionnalité native XAML. Ainsi, toute plate-forme prenant en charge XAML prend en charge x: Reference. 

1
Michael Brown