2016-07-21 23 views
1

我正在开发一款UWP应用程序。我想遍历页面中ListView的所有ListViewItems。这是ListView的xaml。如何在ListView的DataTemplate中设置DataType时访问ListViewItems?

<ListView x:Name="DownloadTaskListView" 
        ItemsSource="{x:Bind ViewModel.CompletedDownloads}" 
        HorizontalContentAlignment="Stretch" 
        Background="{x:Null}"> 
      <ListView.ItemTemplate> 
       <DataTemplate x:DataType="data:DownloadTask"> 
        <Grid x:Name="ItemViewGrid" Background="{x:Null}" Margin="4,0,0,0"> 
        .... 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="HorizontalAlignment" Value="Stretch" /> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
        <Setter Property="BorderThickness" Value="0" /> 
       </Style> 
      </ListView.ItemContainerStyle> 
     </ListView> 

我使用这段代码来实现这一点。

foreach(ListViewItem item in DownloadTaskListView.Items) 
{ 
    // Do something useful 

} 

但它给了我一个例外。因为我设置了DataTemplate的DataType,所以运行时抛出了一个异常,它无法从DownloadTask(在这种情况下是数据类型)转换为ListViewItem。所以我想问一下访问ListViewItems的其他方式是什么?

回答

3

您可以使用ItemsControl.ContainerFromItem method找到对应于指定项容器,然后得到这个容器的根元素,在你的情况下,它是一个Grid。例如像这样:

private void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    foreach (var item in DownloadTaskListView.Items) 
    { 
     var listviewitem = item as DownloadTask; 
     var container = DownloadTaskListView.ContainerFromItem(listviewitem) as ListViewItem; 
     var ItemViewGrid = container.ContentTemplateRoot as Grid; 
     //TODO: 
    } 
} 

要知道,如果你想在SelectionChanged事件的列表视图中使用这种方法,你可以通过所选择的项目为ContainerFromItem方法,否则会找不到ListBoxItem

我应该说,如果可能的话,使用数据绑定更好。

+0

感谢恩典,它的工作原理。我是新的发展,将捆绑松散结束:) –

0

由于您将ItemsSource设置为ViewModel.CompletedDownloads对Item循环执行相同操作。

foreach(var Items in ViewModel.CompletedDownloads) 
{ 
    //Do Something Useful. 
} 
+0

感谢您的回应,但我不想遍历数据源,我想通过ListViewItem来代表UI来执行诸如设置可见性和IsSelected属性等功能。 –

相关问题