2016-12-17 58 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