C# 从嵌套列表视图中获取行索引按钮单击-UWP

C# 从嵌套列表视图中获取行索引按钮单击-UWP,c#,listview,uwp,C#,Listview,Uwp,我有一个嵌套的listview,如下所示。在按钮中显示学生姓名和相应的分数。当我点击按钮时,我想得到clciked行索引。我怎样才能得到它 <ListView x:Name="Mainlist" HorizontalAlignment="Stretch"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:ClassRoomList"> <Grid>

我有一个嵌套的listview,如下所示。在按钮中显示学生姓名和相应的分数。当我点击按钮时,我想得到clciked行索引。我怎样才能得到它

  <ListView x:Name="Mainlist" HorizontalAlignment="Stretch">
     <ListView.ItemTemplate>
     <DataTemplate x:DataType="local:ClassRoomList">
       <Grid>
        <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*" ></ColumnDefinition>
         </Grid.ColumnDefinitions>
          <ListView x:Name="sublist1" ItemsSource="{x:Bind CurrentStudentsArray}" Grid.Column="0" BorderBrush="Black" BorderThickness="0,0,0,1" HorizontalAlignment="Stretch" >
              <ListView.ItemTemplate>
                 <DataTemplate x:DataType="local:CurrentStudentsList">
                    <Grid>
                       <Grid.ColumnDefinitions>
                          <ColumnDefinition Width="*"></ColumnDefinition>
                          <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                           <TextBlock Foreground="Black" FontWeight="Bold" Grid.Column="0" TextWrapping="Wrap"  HorizontalAlignment="Left" VerticalAlignment="Center" Text="{x:Bind StudentName}"/>
                               <ListView x:Name="sublist2" ItemsSource="{x:Bind StudentsMarksArray}" Grid.Column="1" HorizontalAlignment="Stretch" >
                                  <ListView.ItemTemplate>
                                   <DataTemplate x:DataType="local:StudentsMarksList">
                                      <Button Width="120" Height="40" Text="{x:Bind MarkInEnglish}"  Click="ShowDetails_btn_Click">
                                       </Button>
                                    </DataTemplate>
                                   </ListView.ItemTemplate>
                                </ListView>
                         </Grid>
                    </DataTemplate>
              </ListView.ItemTemplate>
            </ListView>
        </Grid>
     </DataTemplate>
   </ListView.ItemTemplate>
Listview将如下所示

 DIANA 35
 DHAYA 45
 HAYAN 55
使用的类I如下所示。它的值绑定到一个可观察的集合。并且该集合被设置为listview的itemsource

  namespace TestClass
 {
 public class ClassRoomList
{
    public int ClassID{ get; set; }
    public ObservableCollection<CurrentStudentsList> CurrentStudentsArray { get; set; }
}

public class CurrentStudentsList
{
    public string StudentName { get; set; }
    public ObservableCollection<StudentsMarksList> StudentsMarksArray { get; set; }

}
public class StudentsMarksList
{
    public string MarkInEnglish { get; set; }
    public string MarkInMaths{ get; set; }
}
名称空间测试类
{
公共班级教室名单
{
public int ClassID{get;set;}
公共可观测集合CurrentStudentsArray{get;set;}
}
公共班级学生名单
{
公共字符串StudentName{get;set;}
公共ObservableCollection StudentsMarksArray{get;set;}
}
公共班级学生成绩表
{
公共字符串MarkInEnglish{get;set;}
公共字符串MarkInMaths{get;set;}
}
}

publicstaticobservedcollection\u ClassRoomList=newobservedcollection()//_ClassRoomList设置为Mainlist的itemsource

发送方将包含引发事件的行项目的datacontext。您可以在单击处理程序中处理它:

private void ShowDetails_btn_Click(object sender, RoutedEventArgs e)
{
     StudentMark selectedItem= ((FrameworkElement)sender).DataContext as StudentMark ;
     //If you are specially interested in index you could get it by:
     int index= CurrentStudentsList.StudentsMarksArray.IndexOf(selectedItem);

}

`

您可以使用
VisualTreeHelper
类获取对父
ListView
和父
ListViewItem
的引用。然后,您可以使用
observedcollection
IndexOf
方法来获取索引:

private void ShowDetails_btn_Click(object sender, RoutedEventArgs e)
{
    DependencyObject depObj = (DependencyObject)sender;
    ListView innerListView = FindParent<ListView>(depObj);
    if (innerListView != null)
    {
        ListViewItem lvi = FindParent<ListViewItem>(innerListView);
        if (lvi != null)
        {
            ListView outerListView = FindParent<ListView>(lvi);
            if (outerListView != null)
            {
                ObservableCollection<CurrentStudentsList> students = outerListView.ItemsSource as ObservableCollection<CurrentStudentsList>;
                if (students != null)
                {
                    int index = students.IndexOf(lvi.Content as CurrentStudentsList);
                }
            }
        }
    }
}

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);
}
private void ShowDetails\u btn\u单击(对象发送者,路由目标)
{
DependencyObject depObj=(DependencyObject)发送方;
ListView innerListView=FindParent(depObj);
如果(innerListView!=null)
{
ListViewItem lvi=FindParent(innerListView);
如果(lvi!=null)
{
ListView outerListView=FindParent(lvi);
if(outerListView!=null)
{
ObservableCollection students=outerListView.ItemsSource作为ObservableCollection;
如果(学生!=null)
{
int index=students.IndexOf(lvi.Content作为CurrentStudentsList);
}
}
}
}
}
私有静态T FindParent(DependencyObject DependencyObject),其中T:DependencyObject
{
var parent=VisualTreeHelper.GetParent(dependencyObject);
if(parent==null)返回null;
var parentT=作为T的父项;
返回父母??找到父母(父母);
}

如何从中获取索引?获取其数据only@user2431727我编辑了答案。如果您同意以复选框作为答案,请创建一个良好的dayStudentsMarksList selectedItem=((FrameworkElement)sender);int index=studentsmarklist.IndexOf(selectedItem);显示:“StudentsMarksList不包含IndexOf的定义”StudentsMarksList未实现集合?是,使用可观察集合。请参阅我编辑的代码显示错误,当前上下文中不存在名称“sublist1”。无法访问student get为1的代码后面的任何内部listview名称(sublist1、sublist2),并且lvi.DataContext为null。原因是什么?但是我得到的是问题中所示的listview,那么lvi的DataContext是什么呢?如果students.Count返回1,那么它会变成null,不是吗?
private void ShowDetails_btn_Click(object sender, RoutedEventArgs e)
{
     StudentMark selectedItem= ((FrameworkElement)sender).DataContext as StudentMark ;
     //If you are specially interested in index you could get it by:
     int index= CurrentStudentsList.StudentsMarksArray.IndexOf(selectedItem);

}
private void ShowDetails_btn_Click(object sender, RoutedEventArgs e)
{
    DependencyObject depObj = (DependencyObject)sender;
    ListView innerListView = FindParent<ListView>(depObj);
    if (innerListView != null)
    {
        ListViewItem lvi = FindParent<ListViewItem>(innerListView);
        if (lvi != null)
        {
            ListView outerListView = FindParent<ListView>(lvi);
            if (outerListView != null)
            {
                ObservableCollection<CurrentStudentsList> students = outerListView.ItemsSource as ObservableCollection<CurrentStudentsList>;
                if (students != null)
                {
                    int index = students.IndexOf(lvi.Content as CurrentStudentsList);
                }
            }
        }
    }
}

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