Ich habe folgendes ListView
:
<ListView Name="TrackListView">
<ListView.View>
<GridView>
<GridViewColumn Header="Title" Width="100"
HeaderTemplate="{StaticResource BlueHeader}"
DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Artist" Width="100"
HeaderTemplate="{StaticResource BlueHeader}"
DisplayMemberBinding="{Binding Album.Artist.Name}" />
</GridView>
</ListView.View>
</ListView>
Wie kann ich jedem gebundenen Element ein Ereignis hinzufügen, das beim Doppelklicken auf das Element ausgelöst wird?
EventSetter
kann zu Speicherverlusten führen, wenn das Ziel des Handlers länger als das desListViewItem
. Ich habe die letzten Tage damit verbracht, ein schwerwiegendes Speicherleck (jeweils 20 MB) zu debuggen, nur um herauszufinden, dassListViewItem
s und der zugehörige Speicher durch einEventSetter
.Keine Speicherverluste (kein Abmelden jedes Elements erforderlich) , funktioniert einwandfrei:
XAML:
C #:
quelle
Meine Lösung basierte auf der Antwort von @ epox_sub, nach der Sie suchen sollten, wo der Ereignishandler in der XAML abgelegt werden soll. Der Code-Behind hat bei mir nicht funktioniert, da
ListViewItems
es sich um komplexe Objekte handelt. Die Antwort von @ sipwiz war ein großartiger Hinweis darauf, wo man suchen sollte ...Der Bonus dabei ist, dass Sie die
SelectedItem
DataContext-Bindung (Track
in diesem Fall) erhalten. Das ausgewählte Element funktioniert, da es durch den ersten Klick des Doppelklicks ausgewählt wird.quelle
Für diejenigen, die hauptsächlich das MVVM-Muster beibehalten möchten, habe ich die Antwort von Andreas Grech verwendet , um eine Lösung zu finden.
ProjectView.xaml:
ProjectView.xaml.cs:
ProjectViewModel.cs:
DelegateCommand.cs finden Sie hier .
In meinem Fall habe ich eine Sammlung von
Project
Objekten, die das füllenListView
. Diese Objekte enthalten mehr Eigenschaften als in der Liste angezeigt, und ich öffne eineProjectDetailView
(eine WPFWindow
), um sie anzuzeigen.Das
sender
Objekt des Ereignishandlers ist das ausgewählteListViewItem
. Anschließend ist dasProject
, auf das ich zugreifen möchte, in derContent
Eigenschaft enthalten.quelle
Versuchen Sie in Ihrem Beispiel zu erfassen, wann ein Element in Ihrer ListView ausgewählt ist oder wann auf eine Spaltenüberschrift geklickt wird? Wenn es das erstere ist, würden Sie einen SelectionChanged-Handler hinzufügen.
In letzterem Fall müssten Sie eine Kombination von MouseLeftButtonUp- oder MouseLeftButtonDown-Ereignissen für die GridViewColumn-Elemente verwenden, um einen Doppelklick zu erkennen und entsprechende Maßnahmen zu ergreifen. Alternativ können Sie die Ereignisse in GridView verarbeiten und von dort aus herausfinden, welche Spaltenüberschrift sich unter der Maus befand.
quelle
Alternative, die ich verwendet habe, ist Event To Command,
quelle
Aufbauend auf der Antwort von epox_spb habe ich eine Überprüfung hinzugefügt, um Fehler beim Doppelklicken in die GridViewColumn-Header zu vermeiden.
quelle
$myListView.Add_MouseDoubleClick({ Param($sender, $ev); $e = [System.Windows.Input.MouseButtonEventArgs]$ev; $itemData = ([System.Windows.FrameworkElement]$e.OriginalSource).DataContext }); if ($item -ne $null) { Write-Host $itemData; } })
--- Casting ist nicht erforderlich, hilft aber in ISE, die Fertigstellung zu erreichen