C# 从嵌套列表视图中获取行索引按钮单击-UWP
我有一个嵌套的listview,如下所示。在按钮中显示学生姓名和相应的分数。当我点击按钮时,我想得到clciked行索引。我怎样才能得到它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 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);
}