Альтернатива ElementName в x: привязка с шаблонами данных

При использовании традиционного синтаксиса {Binding} вы можете указать имя элемента, чтобы указать на определенный элемент управления на странице и получить доступ к его свойствам. Например, если страница называется page, вы можете сделать:

{Binding ElementName=Page, Path=Name}

В синтаксисе {x: Bind} говорится

С x: Bind вам не нужно использовать ElementName = xxx как часть выражения привязки. С помощью x: Bind вы можете использовать имя элемента в качестве первой части пути для привязки, поскольку именованные элементы становятся полями внутри страницы или пользовательского элемента управления, представляющего корневой источник привязки.

Таким образом, для приведенного выше примера в {x: Bind} будет

{x:Bind page.Name}

Что отлично работает, пока не окажется внутри шаблона данных (например, ItemTemplate ListView). В этом случае он больше не работает, поскольку ищет Page в указанном типе данных, что приводит к следующей ошибке (при условии, что мой тип данных - customer):

Ошибка XamlCompiler WMC1110: недопустимый путь привязки «Page.Name»: свойство «Страница» не может быть найдено для типа «Клиент»

Как можно использовать синтаксис {x: Bind} с таблицами данных и элементами управления доступом вне шаблона данных?

Пример кода доступен здесь (обратите внимание на конкретную фиксацию)


person Robert MacLean    schedule 29.09.2015    source источник


Ответы (1)


Насколько мне известно, на данный момент нет способа напрямую привязать к свойству элемента управления с помощью метода x: bind, поскольку он не поддерживает имя элемента внутри его определения привязки.

Это не означает, что вы не можете привязаться к элементу управления внутри dataTemplate, вы все равно можете сделать что-то подобное для доступа к элементам управления, но вы просто не можете использовать скомпилированный синтаксис привязки x: Bind.

 <DataTemplate x:DataType="local:Customer">
     <StackPanel Orientation="Vertical">
         <Button Content="{Binding Name, ElementName=page}" />
         <TextBlock Text="{x:Bind Title}" />
     </StackPanel>        
 </DataTemplate>

Причина ошибки, которую вы получаете, связана с тем, как шаблоны данных являются родительскими для своего источника данных. Привязка x: Bind не может ссылаться на объект управления, а ваш тип Customer имеет свойство Page.Name или путь. Как показано выше, единственный реальный способ получить доступ к свойствам пользовательского элемента управления за пределами вашего элемента управления только с помощью XAML - это вернуться к стандартному механизму привязки.

Надеюсь, это ответит на ваш вопрос.

person davemsdevsa    schedule 29.09.2015