我对绑定(bind)有一个非常讨厌的问题。我知道还有其他有关将itemtemplate内的主题绑定(bind)到模板外的对象的datacontext的主题。但是,这只是行不通的,即第一个文本块根据需要显示为'Test',而itemtemplate内部的相同文本框什么也不显示。
<TextBlock Text="{Binding DataContext.Test, ElementName=myList}"/>
<ItemsControl x:Name="myList" ItemsSource="{Binding AllItems}"
Margin="0,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Center">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<toolkit:WrapPanel Orientation="Horizontal"
ItemHeight="170" ItemWidth="140"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image x:Name="{Binding KeyName}"
Source="{Binding ImagePath}"
Width="128"
Height="128">
</Image>
<TextBlock Text="{Binding DataContext.Test, ElementName=myList}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我希望在这里为您提供一些帮助,因为这对我来说确实是一个问题。
最佳答案
在itemtemplate内部,绑定(bind)被初始化为AllItems
中当前项目的上下文。
更新
在ItemTemplate
之外,您的绑定(bind)是相对于页面的DataContext的。**
一旦进入ItemTemplate
,绑定(bind)就被限制在当时专门评估的项目范围内。
因此,如果我们假设以下情况(基于您问题中的代码):
<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的任何对象都包含具有该名称的属性。据我了解,在itemtemplate内部,从枚举中过去的项目控制了绑定(bind)源,并且不能覆盖它(通过设置ElementName或其他方式)。
如果在枚举中的每个对象中都需要
Test
中的值,则需要将其添加为枚举中对象的属性。我敢肯定,比我更有知识的人可以解释为什么会这样,或者给出更好的解释,但这就是要点。
**假设没有其他的ItemsControl嵌套(或等效的嵌套)
关于silverlight - ItemTemplate内DataContext的访问属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4868992/