Pour ceux qui s'intéressent principalement à la maintenance du modèle MVVM, j'ai utilisé la réponse d'Andreas Grech pour contourner le problème.
Flux de base:
L'utilisateur double-clique sur l'élément -> Gestionnaire d'événements dans le code derrière -> ICommand dans le modèle de vue
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()
{
}
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 peut être trouvé ici .
Dans mon cas, j'ai une collection d' Projectobjets qui peuplent le ListView. Ces objets contiennent plus de propriétés que celles affichées dans la liste, et j'ouvre un ProjectDetailView(un WPF Window) pour les afficher.
L' senderobjet du gestionnaire d'événements est le selected ListViewItem. Par la suite, le Projectauquel je veux accéder est contenu dans la Contentpropriété.