silverlight - ItemTemplate 中 DataContext 的访问属性

标签 silverlight mvvm windows-phone-7

我有一个非常讨厌的绑定(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/

相关文章:

windows-phone-7 - Windows Phone 8 中的 CameraCaptureTask - 自动保存到相机胶卷

c# - 在 Windows Phone 7 中获取媒体播放器状态

c# - Silverlight 可选字段验证

wcf - WCF 服务和 Silverlight 应用程序之间的共享数据对象

c# - 获取 FrameworkElement 边界矩形的坐标

c# - TextBlock 未显示在 ListView 中

silverlight - 是否可以在不创建整个编辑模板的情况下将数据字段添加到 Silverlight DataForm?

c# - 有没有比使用 WhenAnyValue 和 BindTo 更好的方法来设置读写属性?

c# - 在类销毁期间运行方法

javascript - if iemobile 的问题