为什么在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未被调用),因此,菜单不显示。

原因是什么,我如何解决这个问题?

为什么在UWP应用程序中不调用ListView中的ListViewItem

我的猜测是,在第一个实例中:

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只是按原样使用ListViewItemListViewItem的内容是而不是由ItemTemplate生成的。事实上,如果您使用Live Visual Tree工具检查ListViewItem,您将看到它不包含来自ItemTemplateGrid

你的选择是:

  • 如果你要手工制作ListViewItem,那么你要负责设置任何事件处理程序等。
  • (我的建议)不要手工创建ListViewItem s。如果您需要特定项目的特定行为或外观,那么使用ListView.ItemTemplateSelector,或者,如果只是需要更改项目的颜色,则绑定到color属性(您可能也需要IValueConverter)。这对于虚拟化也更好,因为ListView将能够回收项目。