2016-04-06 9 views
0

Ich versuche ein Menü zu erstellen, das angezeigt wird, wenn Sie ein Element in der GridView antippen und halten. Das Menü verfügt über eine Option zum Löschen des Elements aus der Quelle der GridView. Wenn ich auf die Option "Löschen" klicke, wie referenziere ich das Element, auf das ursprünglich geklickt wurde? Hier ist der XAML:Tippen Sie auf das Menü, um das Element zu löschen

<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> 

Und den Code hinter:

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); 
      } 
     } 
    } 
} 

Mein Gedanke war, dass die e.OriginalSource das Element enthalten würde, die auf wurde geklopft, aber die Ausnahme ausgelöst wird, wenn versucht, die finden ID aus deleteAccessBook. Gedanken? Vielen Dank!

Antwort

2

Ich denke, man sollte immer die Datacontext von holded Element, um Ihre Buch Lage:

<GridView Name="SharedBooksGrid" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemClick="BookClicked" IsItemClickEnabled="True" Grid.Row="3" Holding="SharedHold"> 
    <GridView.ItemTemplate> 
     <DataTemplate> 
      <Grid Height="250" Width="400" RightTapped="RightTapHold"> 
       <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> 
private Book deleteAccessBook; 
private void RightTapHold(object sender, RightTappedRoutedEventArgs e) 
{ 
    var holdedElement = e.OriginalSource as FrameworkElement; 
    if (holdedElement == null) return; 
    deleteAccessBook = holdedElement.DataContext as Book; 
    SharedMenu.ShowAt(holdedElement); 
} 

private async void DeleteShared_Tapped(object sender, RoutedEventArgs e) 
{ 
    if (deleteAccessBook == null) return; 
    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); 
      } 
     } 
    } 
} 
+0

Vielen Dank für die Antwort! Ich bekomme deleteAccessBook immer noch als null. – robbiestells

+0

@robbiestells Ich habe einen weiteren Blick auf Ihren Code genommen. In XAML setzen Sie Ihr Flyout in ItemTemplate, so dass es Kontext des Elements bekommt, können Sie Grid getapptes Ereignis (Elementvorlage) statt der gesamten Gridview abonnieren. – Romasz

+0

Wenn ich das Flyout in das ItemTemplate setze, glaube ich nicht, dass ich es in dem Code hinterher verweise. SharedMenu kann nicht gefunden werden, nachdem ich es verschoben habe. – robbiestells

Verwandte Themen