2016-12-17 3 views
0

を取得する方法を私はItemClickハンドラを持っていると私は今、成功しUWPは:RightTapped GridViewの項目に

​​

symbolItemをクリック得ることができます

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

の下に、私がしたい GridViewのように持っています 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で答えをモデル化するが、それは働いていません。グリッドビュー項目を右クリックすると、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は、あなたのDataTemlpateがグリッドであれば、OriginalSourceはグリッドであるTextBlock.ButあるOriginalSourceを持っています。

私たちはvar student = (e.OriginalSource as TextBlock)?.DataContext as Student;を使って生徒を得ることができます。

OriginalSource.DataContextはあなたの選択項目

あるしかし、あなたは、グリッドを使用している場合、OriginalSource月var student = (e.OriginalSource as FrameworkElement)?.DataContext as Student;

を参照してください使用されて簡単methor ListViewItemPresenter.Soです:SymbolControl場合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 FrameworkElement)?StudentとしてのDataContext;は私のために働きます。私の場合、OriginalSourceは 'ListViewItemPresenter'でした。なぜそれが 'GridViewItemPresenter'ではないのですか? –

1

をItemTemplate内の要素はもう少し複雑で、その要素には独自のDataContextがある場合があります。次のヘルパーメソッドを使用して親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;'私の場合は簡単です。だから私は別の1つを選んだ、ありがとう! –

+0

@BingLu mm8の答えは私よりも大きいですが、DataTemplateがTextBlockの場合、期待通りに使用できないことがあります。 – lindexi

関連する問題