我有一个非常讨厌的绑定(bind)问题。我知道还有其他主题是关于将 itemtemplate 内的 itmes 绑定(bind)到模板外的对象的 datacontext。然而,这是行不通的,即第一个文本 block 根据需要显示“测试”,而 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>
我很感激这里的人,因为这对我来说确实是个问题。
最佳答案
在项目模板中,绑定(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 包含具有该名称的属性。
据我了解,在项目模板内,枚举中过去的项目控制绑定(bind)源,并且无法覆盖(通过设置 ElementName 或其他方式)。
如果您在枚举中的每个对象中都需要来自 Test
的值,那么您需要将其添加为枚举中对象的属性。
我敢肯定有人比我更有知识可以解释为什么会这样或给出更好的解释,但这就是它的要点。
** 假设没有其他嵌套的 ItemsControls(或等价物)
关于silverlight - ItemTemplate 中 DataContext 的访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868992/