如何获取列表视图中单元格的行和列索引?

How can i get the row and column index of a cell in a listview?

我有一个 WPF 应用程序,其中的列表视图由 UI 中的网格视图表示。我想要一个事件,当单击此列表视图中的单元格时,我可以看到单元格的行和列索引。目前我可以获得整个列表项(行)但不是被点击的列。

例如,我的列表视图如下所示: List view example

当电子邮件地址 sammy.doe@gmail.com 被点击时,事件处理程序中的 row=2 和 column=2 应该可用,当点击年龄 39 时,row=1 和 column =1 应该可用。

如何在单击事件处理程序中获取此信息。

提前致谢。

在处理这个问题几天后,我找到了一个解决方案,即在单击事件中使用鼠标点位置。然后通过考虑指针的 X 位置搜索 Gridview 列以查找它所在的列。

下面是我的代码:

Class MainWindow
    Public Sub New()

        InitializeComponent()
        Dim items As List(Of User) = New List(Of User)
        items.Add(New User() With {.Name = "Isaac", .Age = 23, .Email = "isaac@email.co.uk", .City = "London", .Phone = "123456789"})
        items.Add(New User() With {.Name = "Jacob", .Age = 29, .Email = "jacob@email.co.uk", .City = "Royston", .Phone = "214563255"})
        lv.ItemsSource = items

        Me.DataContext = Me
    End Sub


    Private Sub Lv_PreviewMouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs)
        Dim gv = DirectCast(lv.View, GridView)
        Dim lvi = DirectCast(sender, ListViewItem)
        Dim p = e.GetPosition(lvi)
        Dim c_n = GetColumnNumber(gv, p)
        Debug.Print("Row: " + lv.SelectedIndex.ToString + "     Column: " + c_n.ToString)
    End Sub

    Public Function GetColumnNumber(gv As GridView, p As Point) As Integer
        Dim n As Integer = 0
        Dim columnFound As Boolean = False
        Dim leftSide = 0
        Dim rightSide = 0
        For Each c In gv.Columns
            rightSide += c.ActualWidth
            If InRange(leftSide, rightSide, p.X) Then
                columnFound = True
                Exit For
            End If
            leftSide = rightSide
            n += 1
        Next
        If Not columnFound Then n = Nothing
        Return n
    End Function

    Public Function InRange(lower As Double, upper As Double, value As Double) As Boolean
        If value < upper And value > lower Then Return True
        Return False
    End Function
End Class



Public Class User
    Public Property Name As String
    Public Property Age As Integer
    Public Property Email As String
    Public Property Phone As String
    Public Property City As String
End Class

这是我的 Xaml:

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ListViewSelection"
        mc:Ignorable="d"
        Title="List View Selection" Height="450" Width="800">
    <Grid>
        <ListView Margin="10" Name="lv">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <EventSetter Event="PreviewMouseLeftButtonUp" Handler="lv_PreviewMouseLeftButtonUp"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" Width="auto" DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Header="Age" Width="auto" DisplayMemberBinding="{Binding Age}"/>
                    <GridViewColumn Header="Email" Width="auto" DisplayMemberBinding="{Binding Email}"/>
                    <GridViewColumn Header="Phone" Width="auto" DisplayMemberBinding="{Binding Phone}"/>
                    <GridViewColumn Header="City" Width="auto" DisplayMemberBinding="{Binding City}"/>
                </GridView>
            </ListView.View>

        </ListView>

    </Grid>
</Window>

我希望这可以帮助其他人。