2016-12-17 72 views
0

我有一個GridView像下面UWP:如何獲得RightTapped GridView的項目

<GridView 
     SelectionMode="None" 
     IsItemClickEnabled="True" 
     IsRightTapEnabled="True" 
     ItemsSource="{x:Bind SymbolItems}" 
     ItemClick="SymbolGridView_ItemClick" 
     RightTapped="SymbolGridView_RightTapped"> 
    <GridView.ItemTemplate> 
     <DataTemplate x:DataType="data:SoundSymbolItem"> 
      <local:SymbolControl/> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 

我有一個ItemClick處理程序,我可以得到的點擊symbolItem成功

​​

現在,我想爲RightTapped事件做類似的事情,但它不能得到正確的輕敲項目。

private void SymbolGridView_RightTapped(object sender, RightTappedRoutedEventArgs e) 
    { 
     SymbolItem symbolItem = (sender as GridViewItem).DataContext as SymbolItem; 
     MyMediaElement.Source = new Uri(this.BaseUri, symbolItem.ExampleAudio); 
    } 

我在這個問題Get RightTapped GridViewItem答案模型來寫我的右手拍了拍上面的處理程序,但它不工作。當我右鍵單擊gridview項目時,會觸發NullReferenceException。

回答

0

您應該在GridVeiw中設置SelectionMode="Single"並設置IsRightTapEnabled =「True」。

我的模型有一個類學生

public class Student : NotifyProperty 
{ 
    public string Name 
    { 
     set 
     { 
      _name = value; 
      OnPropertyChanged(); 
     } 
     get 
     { 
      return _name; 
     } 
    } 

    private string _name; 
} 

和我的ViewModel有一個列表。

我將列表設置爲GridView的源代碼。

我的GridView是

<GridView x:Name="SymbolGridView" 
    SelectionMode="Single" 
    IsItemClickEnabled="True" 
    IsRightTapEnabled="True" 
    ItemsSource="{x:Bind View.Student}" 
    ItemClick="SymbolGridView_OnItemClick" 
    RightTapped="SymbolGridView_OnRightTapped"> 
     <GridView.ItemTemplate> 
      <DataTemplate x:DataType="view:ViewModel"> 
       <TextBlock Text="{Binding Name}"></TextBlock> 
       </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 

SymbolGridView_OnRightTapped有OriginalSource是TextBlock.But如果你的DataTemlpate是一個網格,該OriginalSource爲網格。

我們可以用var student = (e.OriginalSource as TextBlock)?.DataContext as Student;找學生。

的OriginalSource.DataContext是您選擇項目

但是如果你使用網格,OriginalSource可能是ListViewItemPresenter.So容易methor被使用var student = (e.OriginalSource as FrameworkElement)?.DataContext as Student;

參見:http://lindexi.oschina.io/lindexi/post/win10-uwp-%E5%8F%B3%E5%87%BB%E9%80%89%E6%8B%A9GridViewItem

+0

謝謝,'var student =(e.OriginalSource as FrameworkElement)?. DataContext as Student;'適合我。你說在我的情況下,OriginalSource是'ListViewItemPresenter'。爲什麼它不是'GridViewItemPresenter'? –

1

如果SymbolControl在你的ItemTemplate中有點複雜,其中的元素可能有自己的DataContext,你可以使用下面的helper方法獲得對父ListViewItemPresenter的引用,然後將這個DataContext轉換爲Symbol項:

private void SymbolGridView_RightTapped(object sender, RightTappedRoutedEventArgs e) 
{ 
    ListViewItemPresenter lvi = e.OriginalSource as ListViewItemPresenter; 
    if (lvi == null) 
     lvi = FindParent<ListViewItemPresenter>(e.OriginalSource as DependencyObject); 

    if (lvi != null) 
    { 
     SymbolItem clickedItem = lvi.DataContext as SymbolItem; 
     if (clickedItem != null) 
      MyMediaElement.Source = new Uri(this.BaseUri, symbolItem.ExampleAudio); 
    } 
} 

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject 
{ 
    var parent = VisualTreeHelper.GetParent(dependencyObject); 

    if (parent == null) return null; 

    var parentT = parent as T; 
    return parentT ?? FindParent<T>(parent); 
} 
+0

謝謝mm8!您的解決方案適用於我,對其他情況更一般。但我只能選擇一個答案,另一個答案'var student =(e.OriginalSource作爲FrameworkElement)?DataContext as Student;'對於我的案例來說很簡短。所以我選擇了另外一個,非常感謝! –

+0

@BingLu mm8的答案比我大。但是,當DataTemplate是TextBlock時,它可能無法使用。 – lindexi