WPF ListView - détecter lorsque l'élément sélectionné est cliqué
Je suis en utilisant WPF contrôle ListView qui affiche une liste de databound éléments.
<ListView ItemsSource={Binding MyItems}>
<ListView.View>
<GridView>
<!-- declare a GridViewColumn for each property -->
</GridView>
</ListView.View>
</ListView>
Je suis en train d'essayer d'obtenir un comportement similaire à l' ListView.SelectionChanged
événement, seulement je veux aussi détecter si l'élément actuellement sélectionné est activé. Le SelectionChanged
événement ne se déclenche pas si le même élément est cliqué à nouveau (bien évidemment).
Quelle serait la meilleure (la plus propre) façon d'aborder cette question?
InformationsquelleAutor scripni | 2012-04-18
Vous devez vous connecter pour publier un commentaire.
Utiliser la ListView.ItemContainerStyle bien pour donner à votre ListViewItems un EventSetter qui va gérer l'PreviewMouseLeftButtonDown événement. Ensuite, dans le gestionnaire, vérifier pour voir si l'élément sélectionné est sélectionné.
XAML:
Code-behind:
ListView
, il n'est pas nécessaire pour une EventSetter.Vous pouvez gérer la liste de PreviewMouseLeftButtonUp événement.
La raison de ne pas traiter la PreviewMouseLeftButtonDown événement, c'est que, par le temps lorsque vous manipulez de l'événement, la liste est SelectedItem peut encore être null.
XAML:
Code derrière:
Ce sont toutes d'excellentes suggestions, mais si j'étais vous, je voudrais faire cela dans votre modèle de vue. À l'intérieur de votre modèle d'affichage, vous pouvez créer un relais de commande que vous pouvez ensuite lier à l'événement click dans votre modèle d'élément. Pour déterminer si le même élément a été sélectionné, vous pouvez stocker une référence à l'objet sélectionné dans votre modèle de vue. J'aime utiliser MVVM Light pour gérer la liaison. Cela permet à votre projet de bien plus facile à modifier dans l'avenir, et permet de définir la liaison dans le Mélange.
Quand tout est dit et fait, votre XAML ressemblera à ce que Sergey suggéré. Je voudrais éviter d'utiliser le code-behind dans votre point de vue. Je vais éviter d'écrire du code dans cette réponse, car il ya une tonne d'exemples.
Voici un:
Comment utiliser RelayCommand avec le framework MVVM Light
Si vous avez besoin d'un exemple, s'il vous plaît commentaire, et je vais en ajouter un.
~Acclamations
J'ai dit que je n'allais pas faire un exemple, mais je le suis. Ici vous allez.
1) Dans votre projet, ajoutez MVVM Light Uniquement les Bibliothèques.
2) Créer une classe pour votre point de vue. En général, vous avez un modèle d'affichage pour chaque vue (view: MainWindow.xaml && viewModel: MainWindowViewModel.cs)
3) Voici le code pour la très, très, très vue de base modèle:
Tout inclus de l'espace de noms (si elles se présentent ici, je suis en supposant que vous avez déjà ajouté la référence à eux. MVVM Light est Nuget)
Maintenant ajouter une base de classe public:
Maintenant créer votre viewmodel:
Dans votre viewmodel, ajouter un relaycommand. Veuillez noter que j'ai fait ce async et qu'il avait passer un paramètre.
Dans le code-behind pour vous d'afficher, de créer une propriété pour vous viewmodel et définissez le datacontext de la vue, pour le viewmodel (veuillez noter, il y a d'autres façons de le faire, mais je suis en train de faire ce simple exemple.)
Dans votre XAML, vous devez ajouter des espaces de noms en haut de votre code
J'ai ajouté "je" et "Personnalisé".
Voici la liste:
Ici est l'ItemTemplate pour la liste:
Exécuter votre application, et de vérifier la fenêtre de sortie. Vous pouvez utiliser un convertisseur pour gérer le style de l'élément sélectionné.
Cela peut sembler très compliqué, mais il rend la vie beaucoup plus facile en bas de la route lorsque vous avez besoin de séparer votre point de vue à partir de votre ViewModel (par exemple, développer un ViewModel pour de multiples plates-formes.) En outre, il permet de travailler dans le Mélange 10x plus facile. Une fois que vous développer votre ViewModel, vous pouvez le remettre à un designer qui peut le faire paraître très arty :). MVVM Light ajoute certaines fonctionnalités pour rendre le Mélange reconnaître votre ViewModel. Pour la plupart, vous pouvez faire à peu près tout ce que vous voulez dans le ViewModel affecter la vue.
Si quelqu'un lit ce, j'espère que vous trouverez ce utile. Si vous avez des questions, s'il vous plaît laissez-moi savoir. J'ai utilisé MVVM Light dans cet exemple, mais vous pouvez le faire sans MVVM Light.
~Acclamations
Vous pouvez gérer, cliquez sur liste d'éléments comme ceci:
Je vous suggère aussi de la désélection d'un élément, après qu'il a été cliqué et utiliser le MouseDoubleClick événement
Je ne pouvais pas la accepté de répondre à fonctionner de la manière dont je le voulais (voir Farrukh commentaire).
Je suis venu avec un peu différente de la solution qui semble plus natif car il sélectionne l'élément sur le bouton de la souris enfoncé et puis vous êtes en mesure de réagir lorsque le bouton de la souris est libéré:
XAML:
Code derrière: