C# 如何访问数据模板中的项目?

C# 如何访问数据模板中的项目?,c#,xaml,windows-runtime,windows-store-apps,winrt-xaml,C#,Xaml,Windows Runtime,Windows Store Apps,Winrt Xaml,我定义了如下列表视图: <ListView x:Name="libraryBooksListView" AutomationProperties.AutomationId="VideoListView" AutomationProperties.Name="Videos" TabIndex="1"

我定义了如下列表视图:

            <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>
    <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>

我对LibraryBooksItemTemplate的定义如下:

            <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>
    <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,有多个项目(书籍)

  • 如何修改/访问GridView的“ItemTemplateSelector”和SelectionMode等

  • 是否有方法访问BookGridView中的每个项目


  • Thx

    您可以使用ItemsSource访问它:

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

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

    • 最简单的方法是将
      DataTemplate
      内容包装到
      UserControl
    • 另一种方法是使用类似的方法
    • 然后,您还可以使用
      VisualTreeHelper
      类遍历可视化树
    • 然后,您可以再次对
      ItemsControl
      子类化,并覆盖
      GetContainerForItemOverride()
      
      PrepareContainerForItemOverride()
    • 使用属性
    需要注意的重要一点是,
    ItemsSource
    向控件提供项,而重写或生成器提供容器以使用
    itemstemplates
    显示项

    *如需其他问题,请编辑:

    • 如何修改/访问GridView的“ItemTemplateSelector”和SelectionMode等?
      您已经定义了选择器资源,并给了它一个“textbookTemplateSelector”键,所以您可以使用这个来获取它。Resources[“textbookTemplateSelector”]
      SelectionMode
      您可以绑定到相同的源
      DataContext
      您可以将
      ItemsSource
      绑定到该源,并通过绑定进行更改或读取

    • 是否有办法访问BookGridView中的每个项目?
      对由于您的
      DataContext
      被设置为
      ListView
      ItemsSource
      ,因此您可以通过该
      DataContext
      访问所有项目。每个项目似乎都有一个绑定到
      GridView
      items
      属性,因此您可以通过自己定义的
      items
      属性访问每个项目


    我不想将数据模板包装到UserControl中,因为ItemClick and SelectionChanged事件(它们必须在libraryBooksListView级别上进行操作)至于您的其他建议,请您详细说明一下好吗?我认为问题在于你的问题仍然不够精确。我的回答应该为您提供足够的线索,说明如何访问UI中的特定元素,但我怀疑您确实希望访问绑定到UI的项,但这里的解决方案将真正取决于您希望如何使用它们。BookGridView是一个数据模板。我希望能够在此DataTemplate中与GridView“对话”。谢谢。