C# 点击并按住菜单可删除项目
我正在尝试创建一个菜单,当您在GridView中点击并按住某个项目时,该菜单会出现。该菜单具有从GridView源中删除该项的选项。当我点击“删除”选项时,如何引用最初单击的项目?以下是Xaml: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 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);
}
}
}
}