2014-05-15 69 views
0

我这样定义一个ListView:如何访问DataTemplate中的项目?

  <ListView  x:Name="libraryBooksListView" 
         AutomationProperties.AutomationId="VideoListView" 
         AutomationProperties.Name="Videos" 
         TabIndex="1" 
         Padding="0,0,4,0" 
         ItemsSource="{Binding}" 
         IsSwipeEnabled="False" 
         ItemTemplate="{StaticResource LibraryBooksItemTemplate}" 
         ItemContainerStyle="{StaticResource LibraryListViewItemStyle}" 
         Grid.Column="1" 
         SelectionMode="None"> 
     </ListView> 

和我这样定义的LibraryBooksItemTemplate:

<DataTemplate x:Key="LibraryBooksItemTemplate"> 
     <Grid Margin="0"> 

      <GridView x:Name="booksGridView" 
         AutomationProperties.AutomationId="ItemGridView" 
         AutomationProperties.Name="Grouped Items" 
         ItemsSource="{Binding Items}" 
         ItemTemplateSelector="{StaticResource textbookTemplateSelector}" 
         SelectionMode="Multiple" 
         IsItemClickEnabled="True" 
         ItemClick="booksGridView_ItemClick" 
         SelectionChanged="booksGridView_SelectionChanged" 
         IsSwipeEnabled="false" 
         ScrollViewer.VerticalScrollBarVisibility="Auto"> 

       <GridView.ItemsPanel> 
        <ItemsPanelTemplate> 
         <WrapGrid Orientation="Horizontal" /> 
        </ItemsPanelTemplate> 
       </GridView.ItemsPanel> 
      </GridView> 

     </Grid> 
    </DataTemplate> 

GridView控件,booksGridView,有多个项目(书籍)。

  1. 如何修改/访问GridView的“ItemTemplateSelector”和SelectionMode等?

  2. 有没有方法可以访问booksGridView中的每个项目?

THX

回答

1

有很多方法可以做到这一点。

  • 最简单的方法是将您的DataTemplate内容包装为UserControl
  • 另一个是使用类似ContainerFromIndex()
  • 然后,您还可以使用VisualTreeHelper类来走视觉树。
  • 再说你也可以继承你的ItemsControl和覆盖GetContainerForItemOverride() PrepareContainerForItemOverride()
  • 使用ItemContainerGenerator财产

的项重要的一点要注意的是,你的ItemsSource提供项目的控制,而替代或发电机提供容器显示使用ItemTemplates项目。

*编辑至于你的其他问题:

  • 如何修改/访问 “ItemTemplateSelector” 和的SelectionMode等在GridView的?
    你已经定义了你的选择器资源并给了它一个“textbookTemplateSelector”的关键字,所以你可以用this.Resources [“textbookTemplateSelector”]来获得它。 SelectionMode你可以绑定到相同的源DataContext你绑定你的ItemsSource并通过绑定更改或阅读它。

  • 有没有方法可以访问booksGridView中的每个项目?
    是的。由于您的DataContext设置为您的ListViewItemsSource - 您可以通过DataContext访问所有项目。这些项目中的每一个似乎都有一个绑定到GridViewItems属性,因此您可以通过您自己定义的Items属性访问其中的每个属性。

+0

由于ItemClick和SelectionChanged事件(它们必须作用于libraryBooksListView级别),我不想将DataTemplate包装到UserControl中 至于其他建议,请您详细说明一下吗? Thx。 –

+0

我认为问题在于你的问题仍然不够精确。我的回答应该给你提供足够的关于如何访问UI中特定元素的线索,但我怀疑你确实想访问绑定到UI的项目,但这里的解决方案将取决于你想要对它们做什么。 –

+0

Thx为您的答案。 –

0

可以使用的ItemsSource访问:

foreach(var book in this.booksGridView.ItemsSource) 
{ 
} 
+0

booksGridView是一个DataTemplate。我希望能够在这个DataTemplate中“谈论”GridView。 Thx。 –

相关问题