我对绑定有一个非常讨厌的问题。我知道还有其他主题涉及将itemtemplate中的itmes绑定到模板外部对象的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>
我很感激大家的帮助,因为这对我来说确实是一个问题。
答案 0 :(得分:4)
在itemtemplate中,绑定被初始化为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包含具有该名称的属性。
据我了解,在itemtemplate中,枚举中的项目控制绑定源,并且无法覆盖(通过设置ElementName或其他方式)。
如果您需要枚举中每个对象的Test
值,那么您需要将其添加为枚举中对象的属性。
我确信比我知识渊博的人可以解释为什么会这样或给出更好的解释,但这就是它的要点。
**假设没有其他的ItemsControls嵌套(或等效的)