我正在开发一款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的另一种方式是什么?
答案 0 :(得分: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
}。
我应该说,如果可能的话,使用数据绑定会更好。
答案 1 :(得分:0)
由于您将ItemsSource设置为 ViewModel.CompletedDownloads ,因此请执行Item循环。
foreach(var Items in ViewModel.CompletedDownloads)
{
//Do Something Useful.
}