当在ListView的DataTemplate中设置了DataType时,如何访问ListViewItems

本文关键字:何访问 访问 ListViewItems DataTemplate ListView 设置 DataType 当在 | 更新日期: 2023-09-27 17:58:04

我正在开发一个UWP应用程序。我想遍历页面中ListView的所有ListViewItems。这是ListView的xaml。

<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的另一种方式是什么?

当在ListView的DataTemplate中设置了DataType时,如何访问ListViewItems

您可以使用ItemsControl.ContainerFromItem方法查找与指定项对应的容器,然后获取该容器的根元素,在您的情况下,它是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事件中使用此方法,您可以将所选的Item传递到ContainerFromItem方法中,否则它将找不到ListBoxItem

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

由于您将ItemsSource设置为ViewModel.CompletedDownloads,因此对其执行Item循环。

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