在ItemTemplate中访问DataContext的属性

时间:2011-02-01 23:04:20

标签: silverlight mvvm windows-phone-7

我对绑定有一个非常讨厌的问题。我知道还有其他主题涉及将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>

我很感激大家的帮助,因为这对我来说确实是一个问题。

1 个答案:

答案 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嵌套(或等效的)