C# 点击并按住菜单可删除项目

C# 点击并按住菜单可删除项目,c#,xaml,win-universal-app,C#,Xaml,Win Universal App,我正在尝试创建一个菜单,当您在GridView中点击并按住某个项目时,该菜单会出现。该菜单具有从GridView源中删除该项的选项。当我点击“删除”选项时,如何引用最初单击的项目?以下是Xaml: <GridView Name="SharedBooksGrid" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemClick="BookClicked" IsItemClickEnabled="True" Grid.Row="3" Ho

我正在尝试创建一个菜单,当您在GridView中点击并按住某个项目时,该菜单会出现。该菜单具有从GridView源中删除该项的选项。当我点击“删除”选项时,如何引用最初单击的项目?以下是Xaml:

<GridView Name="SharedBooksGrid" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemClick="BookClicked" IsItemClickEnabled="True" Grid.Row="3" Holding="SharedHold"  RightTapped="RightTapHold">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid Height="250" Width="400">
                    <Image Source="{Binding BookImage}" Stretch="UniformToFill"/>
                    <Rectangle Opacity="0.35" Fill="Black" Height="60" VerticalAlignment="Top" />
                    <TextBlock Text="{Binding BookName}" FontSize="29" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10" Foreground="White" />
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
        <FlyoutBase.AttachedFlyout>
            <MenuFlyout x:Name="SharedMenu">
                <MenuFlyoutItem Text="Make Default" />
                <MenuFlyoutSeparator />
                <MenuFlyoutItem Text="Delete" Click="DeleteShared_Tapped" />
            </MenuFlyout>
        </FlyoutBase.AttachedFlyout>
    </GridView>

我的想法是e.OriginalSource将包含被点击的项,但是当试图从deleteAccessBook中查找id时会抛出异常。思想?谢谢

我认为您应该能够通过获取holded元素的DataContext来获取您的书:


private Book删除accessbook;
私有void RightTapHold(对象发送方,RightTappedRoutedEventArgs e)
{ 
var holdeElement=e.OriginalSource作为框架元素;
if(holdeElement==null)返回;
deleteAccessBook=HoldeElement.DataContext作为书本;
SharedMenu.ShowAt(HoldeElement);
}
私有异步void deleteSharred_(对象发送方,RoutedEventArgs e)
{
if(deleteAccessBook==null)返回;
bookAccessCollection=等待BookAccessTable.ToCollectionAsync();
foreach(bookAccessCollection中的var项)
{
if(item.UserId==App.MobileService.CurrentUser.UserId)
{
if(item.BookId==deleteAccessBook.id)
{
等待BookAccessTable.DeleteAsync(项);
}
}
}
}

我认为您应该能够通过获取holded元素的DataContext来获取书籍:


private Book删除accessbook;
私有void RightTapHold(对象发送方,RightTappedRoutedEventArgs e)
{ 
var holdeElement=e.OriginalSource作为框架元素;
if(holdeElement==null)返回;
deleteAccessBook=HoldeElement.DataContext作为书本;
SharedMenu.ShowAt(HoldeElement);
}
私有异步void deleteSharred_(对象发送方,RoutedEventArgs e)
{
if(deleteAccessBook==null)返回;
bookAccessCollection=等待BookAccessTable.ToCollectionAsync();
foreach(bookAccessCollection中的var项)
{
if(item.UserId==App.MobileService.CurrentUser.UserId)
{
if(item.BookId==deleteAccessBook.id)
{
等待BookAccessTable.DeleteAsync(项);
}
}
}
}

感谢您的回复!但我仍然将deleteAccessBook设置为空。@Robbies告诉我,我已经再次查看了您的代码。在XAML中,将弹出按钮放在ItemTemplate中,以便它获取项目的上下文,您可以订阅Grid tapped event(ItemTemplate),而不是整个gridview。如果我将弹出按钮放在ItemTemplate中,我不相信我可以在后面的代码中引用它。在我移动SharedMenu后找不到它。@Robbies告诉我这是正常的-如果您在少数项目中有常规弹出按钮-应该显示哪一个?我编辑了一些代码——xaml和cs——datacontext是从itemtemplate的网格中知道的,然后通过变量传递给弹出按钮的事件。还有其他几种方法可以实现这一点。感谢您的回复!但我仍然将deleteAccessBook设置为空。@Robbies告诉我,我已经再次查看了您的代码。在XAML中,将弹出按钮放在ItemTemplate中,以便它获取项目的上下文,您可以订阅Grid tapped event(ItemTemplate),而不是整个gridview。如果我将弹出按钮放在ItemTemplate中,我不相信我可以在后面的代码中引用它。在我移动SharedMenu后找不到它。@Robbies告诉我这是正常的-如果您在少数项目中有常规弹出按钮-应该显示哪一个?我编辑了一些代码——xaml和cs——datacontext是从itemtemplate的网格中知道的,然后通过变量传递给弹出按钮的事件。还有其他几种方法可以实现这一点。
private Book deleteAccessBook;
private void RightTapHold(object sender, RightTappedRoutedEventArgs e)
{ 
    Point point = e.GetPosition(sender as UIElement);
    SharedMenu.ShowAt(sender as UIElement, point);
}

private async void DeleteShared_Tapped(object sender, RoutedEventArgs e)
{
    deleteAccessBook = e.OriginalSource as Book;
    bookAccessCollection = await BookAccessTable.ToCollectionAsync();
    foreach (var item in bookAccessCollection)
    {
        if (item.UserId == App.MobileService.CurrentUser.UserId)
        {
            if (item.BookId == deleteAccessBook.id)
            {
                await BookAccessTable.DeleteAsync(item);
            }
        }
    }
}