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' Project
objets 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' sender
objet du gestionnaire d'événements est le selected ListViewItem
. Par la suite, le Project
auquel je veux accéder est contenu dans la Content
propriété.