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

时间:2016-09-30 21:39:11

标签: c# xaml listview uwp

我的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),因此,菜单不会出现。

原因是什么?如何解决?

1 个答案:

答案 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只是按原样使用ListViewItemListViewItem生成的ItemTemplate内容 。实际上,如果您使用实时视觉树工具检查ListViewItem,您会发现它不包含Grid中的ItemTemplate

您的选择是:

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