【问题标题】:Access property of DataContext inside ItemTemplateItemTemplate 内 DataContext 的访问属性
【发布时间】:2011-06-19 15:11:07
【问题描述】:

我对绑定有一个非常讨厌的问题。我知道还有其他关于将 itemtemplate 内的项目绑定到模板外对象的数据上下文的主题。但是,这不起作用,即第一个文本块根据需要显示“测试”,而 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>

我希望能得到一些帮助,因为这对我来说确实是个问题。

【问题讨论】:

  • 这有点神秘......我尝试复制你在这里拥有的东西,它似乎对我有用。它可能会帮助您的潜在回答者产生其中之一:sscce.org

标签: silverlight mvvm windows-phone-7


【解决方案1】:

在itemtemplate内部,绑定被初始化为AllItems中当前item的上下文。

更新

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 嵌套(或等效项)

【讨论】:

  • 这就是 {Binding DataContext.Test, ElementName=myList} 的重点。
  • Miroslav,请重新阅读 Matt 的评论。正确的绑定格式是 {Binding Test},因为 ItemTemplate.DataContext 已被设置为单个项目。
  • 对不起,我想解释不是我的强项。 'Test' 属性不在集合 AllItems 中。这就是为什么我想获取 myList 的 DataContext 以便我可以检索 Test 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2015-02-11
  • 1970-01-01
  • 2010-12-03
  • 2020-01-20
相关资源
最近更新 更多