2010-01-11 6 views
1

Pour une raison très spécifique, je veux sélectionner ListViewItem s sur le bouton de la souris, pas réellement sur le bouton de la souris. Je veux que ce comportement soit intégré dans le contrôle. Est-il possible d'y parvenir? quelqu'un peut-il donner un indice?WPF Listview modification

Répondre

2

réponse du P. Aviad est une bonne et une utilisation intelligente des propriétés attachées, mais je tendance à utiliser une technique différente la plupart du temps:

  1. ListViewItem Sous-classe.
  2. Remplacez OnMouseLeftButtonDown et OnMouseRightButton pour ne rien faire.
  3. Substituez OnMouseLeftButtonUp/OnMouseRightButtonUp pour appeler base.OnMouseLeftButtonDown/base.OnMouseRightButtonDown.
  4. Sous-classe ListView.
  5. Remplacer GetContainerForItemOverride() pour retourner votre ListViewItem override

Cela me semble plus facile à que de souscrire à des événements ItemContainer et l'ajout de gestionnaires dynamiquement.

Voici ce qu'il ressemble à:

public class MouseUpListViewItem : ListViewItem 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {} 
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) {} 

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
    base.OnMouseLeftButtonDown(e); 
    } 
    protected override void OnMouseRightButtonUp(MouseButtonEventArgs e) 
    { 
    base.OnMouseRightButtonDown(e); 
    } 
} 
public class MouseUpListView : ListView 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
    return new MouseUpListViewItem(); 
    } 
} 

J'aime cette technique parce qu'il ya moins de code impliqué.

+0

Bonne réponse, j'ai réussi à implémenter ma solution de propriété jointe, mais il s'est avéré juste un peu trop compliqué et difficile que j'espérais! :) –

3

Oui, c'est certainement possible en utilisant les propriétés attachées. Définissez une propriété attachée appelée SelectOnMouseUp et lorsqu'elle est définie sur true, connectez-vous à vos événements ItemsContainerGenerator pour découvrir à quel moment un nouveau conteneur d'éléments est ajouté. Ensuite, lorsque vous obtenez un événement pour un nouveau conteneur d'articles, connectez-vous dans PreviewMouseDown et ignorez-le (définissez e.Handled sur true), puis connectez-vous à son événement MouseUp et effectuez la sélection (définissez IsSelected à true).

+0

Merci pour la réponse, est-ce possible dans XAML de toute façon? –

+0

Vous ne pouvez pas 'masquer' le comportement normal de 'MouseDown' dans du XAML pur. –

+0

+1 pour une utilisation intelligente des propriétés attachées et 'ItemContainerGenerator', mais voir aussi ma réponse qui résout le problème plus simplement en utilisant' GetContainerForItemOverride' –