Внутри ListView у меня есть GridView, и я пытаюсь настроить его так, чтобы, когда пользователь щелкает правой кнопкой мыши «строку» в ListView, я мог получить доступ к исходному объекту данных.Я думаю, что это часть сетки ViewView ListView, которая делает это немного сложнее.
Я создал образец, который демонстрирует, где у меня возникают трудности.Когда пользователь щелкает правой кнопкой мыши по строке, например Person1, я хотел бы получить доступ к объекту данных PersonClass в обработчике MenuItem_Click.Я пытался играть с PlacementTarget, но все, что я получаю, это нулевые объекты или объекты типа MenuItem.
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ContextMenu Name="cm" x:Key="TestContextMenu">
<MenuItem Header="Context1" Click="MenuItem_Click"/>
<MenuItem Header="Context2"/>
<MenuItem Header="Context3"/>
</ContextMenu>
</Window.Resources>
<Grid>
<ListView Margin="20" Name="TestListView" SelectionMode="Multiple">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="ContextMenu" Value="{StaticResource TestContextMenu}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="FirstName" Width="200" DisplayMemberBinding="{Binding Path=FirstName}"/>
<GridViewColumn Header="Surname" Width="200" DisplayMemberBinding="{Binding Path=Surname}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
Код:
Class MainWindow
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim Person1 As New PersonClass("John", "Fletcher")
Dim Person2 As New PersonClass("Bob", "Smith")
Dim ListOfPersons As New List(Of PersonClass)
ListOfPersons.Add(Person1)
ListOfPersons.Add(Person2)
TestListView.ItemsSource = ListOfPersons
End Sub
Private Sub MenuItem_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
MsgBox(e.OriginalSource.ToString)
MsgBox(sender.ToString)
MsgBox(e.Source.ToString)
End Sub
End Class
Public Class PersonClass
Private _firstName As String
Private _surname As String
Public Property FirstName() As String
Get
Return _firstName
End Get
Set(ByVal Value As String)
_firstName = Value
End Set
End Property
Public Property Surname() As String
Get
Return _surname
End Get
Set(ByVal Value As String)
_surname = Value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(FirstName As String, Surname As String)
Me.FirstName = FirstName
Me.Surname = Surname
End Sub
End Class