我的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"));
它工作正常,Meny Flyout在保存ListView项目时出现在模拟器中。
但是当我添加以下项目时(我需要它来设置颜色等):
ListViewItem listItem = new ListViewItem();
listItem.Content = departure.Time.ToString(@"hh\:mm");
DeparturesListView.Items.Add(listItem);
保持不起作用(未调用Grid_Holding),因此,菜单不会出现。
原因是什么?如何解决?
答案 0 :(得分:0)
我猜是第一次:
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
内容 。实际上,如果您使用实时视觉树工具检查ListViewItem
,您会发现它不包含Grid
中的ItemTemplate
。
您的选择是:
ListViewItem
,那么您有责任设置任何事件处理程序等。ListViewItem
。如果您需要特定项目的特殊行为或外观,请使用ListView.ItemTemplateSelector
,或者,如果它只是需要更改的项目的颜色,则绑定到颜色属性(您可能还需要IValueConverter
)。这对于虚拟化来说也更好,因为ListView
将能够回收物品。