为什么在UWP应用程序中不调用ListView中的ListViewItem
本文关键字:调用 ListView 中的 ListViewItem UWP 应用程序 为什么 | 更新日期: 2023-09-27 18:09:39
我在我的UWP应用程序的页面上有一个ListView:
<ListView x:Name="ArrivalsListView" Margin="30,135,40,160">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Holding="Grid_Holding" Background="Transparent" VerticalAlignment="Stretch">
<ItemsControl Holding="Grid_Holding">
<FlyoutBase.AttachedFlyout>
<MenuFlyout>
<MenuFlyoutItem x:Name="EditButton" Background="Transparent" Text="Edit" Click="EditClick"/>
<MenuFlyoutItem x:Name="RemoveButton" Background="Transparent" Text="Remove" Click="RemoveClick"/>
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
</ItemsControl>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
可以看到,它包含MenuFlyout,它在后面的代码中附加到Holding:
private void Grid_Holding(object sender, HoldingRoutedEventArgs e)
{
FrameworkElement senderElement = sender as FrameworkElement;
FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);
flyoutBase.ShowAt(senderElement);
}
当我向ListView添加项目时,如下所示
ArrivalsListView.Items.Add(arrival.Time.ToString(@"hh':mm"));
它工作得很好,并且在按住ListView项的模拟器中出现了许多弹出窗口。
但是当我像下面这样添加项目时(我需要它来设置颜色等):
ListViewItem listItem = new ListViewItem();
listItem.Content = departure.Time.ToString(@"hh':mm");
DeparturesListView.Items.Add(listItem);
按住不工作(Grid_Holding未被调用),因此,菜单不显示。
原因是什么,我如何解决这个问题?
我的猜测是,在第一个实例中:
ArrivalsListView.Items.Add(arrival.Time.ToString(@"hh':mm"));
给ListView
一个字符串作为项。为了显示这个,它需要用这个字符串创建一个ListViewItem
作为它的DataContext
。它使ItemTemplate
膨胀,以便为新的ListViewItem
创建内容,从而正确地连接Holding
事件(因为它是模板的一部分)。
在第二个例子中:
ListViewItem listItem = new ListViewItem();
listItem.Content = departure.Time.ToString(@"hh':mm");
DeparturesListView.Items.Add(listItem);
您正在给ListView
一个您已经配置的自定义ListViewItem
(如您所提到的,具有自定义颜色等)。在这种情况下,ListView
只是按原样使用ListViewItem
。ListViewItem
的内容是而不是由ItemTemplate
生成的。事实上,如果您使用Live Visual Tree工具检查ListViewItem
,您将看到它不包含来自ItemTemplate
的Grid
。
你的选择是:
- 如果你要手工制作
ListViewItem
,那么你要负责设置任何事件处理程序等。 - (我的建议)不要手工创建
ListViewItem
s。如果您需要特定项目的特定行为或外观,那么使用ListView.ItemTemplateSelector
,或者,如果只是需要更改项目的颜色,则绑定到color属性(您可能也需要IValueConverter
)。这对于虚拟化也更好,因为ListView
将能够回收项目。