XAML 2009 - x: Ссылка - есть ли недостатки в использовании этого?
У меня всего несколько месяцев опыта работы с XAML, и мне часто бывает трудно определить, как связывать или ссылаться на элементы, определенные в разных местах моего XAML. Недавно я столкнулся с X:Reference, который, как я понимаю, является новым для XAML 2009 и.NET 4.
Например, предположим, что я пытаюсь привязать свойство IsChecked элемента с именем DisplayIndicator, который определен в другом месте моего XAML. X: Ссылка позволяет мне сделать это следующим образом:
{Binding Source={x:Reference DisplayIndicator}, Path=IsChecked}
Это кажется простым способом (и предпочтительным способом?) Ссылаться почти на любой элемент, объявленный в моем XAML. Я ошибаюсь по этому поводу? Есть ли недостаток в использовании этого?
Спасибо большое.
2 ответа
От x:Reference
документация:
В WPF и XAML 2006 ссылки на элементы рассматриваются с помощью функции уровня структуры привязки ElementName. Для большинства приложений и сценариев WPF все еще следует использовать привязку ElementName. Исключения из этого общего руководства могут включать случаи, когда существуют контекст данных или другие соображения, связанные с областью применения, которые делают нецелесообразным привязку данных, и когда компиляция разметки не участвует.
Я также только использую x:Reference
если ElementName
это не вариант. Единственное, что здесь не упомянуто, это то, что x:Reference
довольно требователен к циклическим зависимостям, что не относится к ElementName
; так что это будет недостатком.
К сожалению, вы не можете использовать функции XAML 2009 с XAML, который используется для определения визуальных элементов в приложении WPF. См. http://msdn.microsoft.com/en-us/library/ee792007.aspx:
В WPF вы можете использовать функции XAML 2009, но только для XAML, который не скомпилирован с разметкой WPF. Скомпилированный с разметкой XAML и форма XAML BAML в настоящее время не поддерживают ключевые слова и функции языка XAML 2009.
Но что касается x:Reference
есть легкая альтернатива:
{Binding ElementName=DisplayIndicator, Path=IsChecked}