В чем разница между 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
?:
Исключения из этого общего руководства могут включать случаи, когда есть контекст данных или другие соображения, которые делают невозможным привязку данных и где компиляция разметки не задействована.
Ответы
Ответ 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.