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.
Grundablauf:
Benutzer doppelklickt auf Element -> Ereignishandler im Code dahinter -> Befehl im Ansichtsmodell
ProjectView.xaml:
<UserControl.Resources>
<Style TargetType="ListViewItem" x:Key="listViewDoubleClick">
<EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/>
</Style>
</UserControl.Resources>
...
<ListView ItemsSource="{Binding Projects}"
ItemContainerStyle="{StaticResource listViewDoubleClick}"/>
ProjectView.xaml.cs:
public partial class ProjectView : UserControl
{
public ProjectView()
{
InitializeComponent();
}
private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
((ProjectViewModel)DataContext)
.ProjectClick.Execute(((ListViewItem)sender).Content);
}
}
ProjectViewModel.cs:
public class ProjectViewModel
{
public ObservableCollection<Project> Projects { get; set; } =
new ObservableCollection<Project>();
public ProjectViewModel()
{
//Add items to Projects
}
public ICommand ProjectClick
{
get { return new DelegateCommand(new Action<object>(OpenProjectInfo)); }
}
private void OpenProjectInfo(object _project)
{
ProjectDetailView project = new ProjectDetailView((Project)_project);
project.ShowDialog();
}
}
DelegateCommand.cs finden Sie hier .
In meinem Fall habe ich eine Sammlung von Project
Objekten, die das füllen ListView
. Diese Objekte enthalten mehr Eigenschaften als in der Liste angezeigt, und ich öffne eine ProjectDetailView
(eine WPF Window
), um sie anzuzeigen.
Das sender
Objekt des Ereignishandlers ist das ausgewählte ListViewItem
. Anschließend ist das Project
, auf das ich zugreifen möchte, in der Content
Eigenschaft enthalten.