Доступ к свойству DataContext внутри ItemTemplate - PullRequest
3 голосов
/ 02 февраля 2011

У меня действительно неприятная проблема с привязками.Я знаю, что есть другие темы, связанные с привязкой itmes внутри itemtemplate к datacontext объекта вне шаблона.Тем не менее, это просто не будет работать, то есть в первом текстовом блоке отображается «Test» по желанию, тогда как в том же текстовом поле внутри шаблона элемента ничего не отображается.проблема для меня.

1 Ответ

4 голосов
/ 02 февраля 2011

Внутри шаблона элемента привязка инициализируется в контексте текущего элемента в AllItems.

Обновление

За пределами ItemTemplate ваших привязокотносятся к DataContext страницы. **

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

Итак, если мыпредположим следующее (основываясь на коде в вашем вопросе):

<ItemsControl x:Name="myList" ItemsSource="{Binding AllItems}" >
    <ItemsControl.ItemTemplate>
         <DataTemplate>
             <StackPanel>
                 <TextBlock x:Name="tb1"
                        Text="{Binding DataContext.Test, ElementName=myList}"/>
                 <TextBlock x:Name="tb2" Text="{Binding KeyName}"/>
             </StackPanel>
         </DataTemplate>
     </ItemsControl.ItemTemplate>
 </ItemsControl>

tb1 не может напрямую получить доступ к объекту DataContext.
tb2 не может получить доступ KeyName - при условии, что любой объект AllItems - это IEnumerable, содержащий свойство с этим именем.

Насколько я понимаю, внутри шаблона элемента элемент, прошедший из перечисления, контролирует источник привязки, и это не может быть переопределено (путем установки ElementName или иным образом).

Если вам нужно значение из Test в каждом объекте в вашем перечислении, вам нужно добавить его как свойство объекта в перечислении.

Я уверен, что кто-то более знающий, чем я, мог бы объяснить, почему это так, или дать лучшее объяснение, но в этом суть.

** Предполагая, что нет других вложений ItemsControls (или эквивалентных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...