Öğe

2016-04-06 24 views
0

Öğeyi silmek için basılı tutun ve GridView öğesinde bir öğeye dokunup basılı tutulduğunda görüntülenen bir menü oluşturmaya çalışıyorum. Menü, öğeyi GridView kaynağından silme seçeneğine sahiptir. "Sil" seçeneğine dokunduğumda, orijinal olarak tıklanan öğeye nasıl başvuru yapabilirim? İşte Xaml var:Öğe

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

Ve arkasındaki kodu:

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

Benim düşünce bulunmaya çalışılırken e.OriginalSource vurulmuştur öğeyi içerecektir, ancak istisna atılan olmasıydı deleteAccessBook'dan kimlik. Düşünceler? Teşekkürler!

cevap

2

Sana Düzenlenen elemanın DataContext'i alarak Kitabı elde edebilmek gerektiğini düşünüyorum: cevap için

<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

Teşekkür! Yine de yine de boş bir şekilde deleteAccessBook alıyorum. – robbiestells

+0

@robbiestells Kodunuza bir kez daha baktım. XAML'de, flyout'unuzu ItemTemplate içine koyun, böylece öğenin içeriğini alır, tüm gridview yerine Grid tapped event'e (itemtemplate) abone olabilirsiniz. – Romasz

+0

Öğe kutusunu ItemTemplate içine koyarsam, arkasındaki kodda referans gösterebileceğime inanmıyorum. SharedMenu, taşıdıktan sonra bulunamıyor. – robbiestells