Подтвердить что ты не робот

В чем разница между x: Reference и ElementName?

В соответствии с x: ссылочной расширением расширений на MSDN, x:Reference

Ссылки на экземпляр, объявленный в другом месте в разметке XAML. Ссылка ссылается на элемент x: Name.

В соответствии с Binding.ElementName Property на MSDN, ElementName

Значение свойства Name или x: Директива названия интересующего элемента.

Оглядываясь на раздел замечаний на первой странице:

x: ссылка и WPF

В WPF и XAML 2006 ссылки на элементы рассматриваются с помощью функции уровня элемента привязки ElementName. Для большинства приложений и сценариев WPF необходимо использовать привязку ElementName. Исключения из этого общего руководства могут включать случаи, когда есть контекст данных или другие соображения, которые делают невозможным привязку данных и где компиляция разметки не задействована.

Для полноты, вот часть раздела замечаний на странице ElementName:

Это свойство полезно, если вы хотите привязать к свойству другого элемента вашего приложения. Например, если вы хотите использовать ползунок для управления высотой другого элемента управления в вашем приложении или если вы хотите связать содержимое своего элемента с свойством SelectedValue вашего элемента управления ListBox.

Теперь, когда я полностью осознаю, когда и как использовать свойство ElementName, я не совсем понимаю разницу между ним и расширением разметки x:Reference. Может ли кто-нибудь объяснить это и, в частности, расширить последнее предложение, указанное в разделе примечаний x:Reference?:

Исключения из этого общего руководства могут включать случаи, когда есть контекст данных или другие соображения, которые делают невозможным привязку данных и где компиляция разметки не задействована.

4b9b3361

Ответ 1

По сути, как вы сказали, эти двое делают почти одно и то же. Однако есть небольшие отличия под капотом.

{x:Reference...} → возвращает просто ссылку на объект, который не создает этот "мост" между двумя свойствами, как это делает привязка. За всем тем, что используется служба, которая ищет данное имя в определенной области, обычно это само окно.

{Binding ElementName="..." } → сначала он создает этот объект привязки, а затем ищет имя объекта, но не с помощью той же техники, что и x: Reference. Алгоритм поиска перемещается вверх и/или вниз в VisualTree, чтобы найти нужный элемент. Поэтому функциональное VisualTree всегда необходимо. Как пример, когда используется внутри Non-UiElement, он не будет работать. В конце концов, Привязка остается и делает свой хлеб насущный.

Это не сработает:

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

Это работает:

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

Вроде как то :)

Ответ 2

ElementName является специфичным для платформы. То есть это может быть или не быть основано на той платформе, которую вы используете. x: Ссылка поднимает эту концепцию на собственную функцию XAML. Таким образом, любая платформа, поддерживающая XAML, поддерживает x: Reference.