2009-07-23 9 views
2

J'essaie de développer une fonctionnalité de filtrage pour WPF DataGrid (à partir de la boîte à outils WPF). Je souhaite qu'un utilisateur clique avec le bouton droit sur une cellule et sélectionne Filter à partir de son CcontextMenu, puis la grille doit être filtrée par la valeur de la cellule.WPF DataGrid: Obtenir la propriété de liaison de colonne pour le filtrage

J'essaie le modèle M-V-VM. Le datacontext de mes fenêtres est MainWindowViewModel qui a la propriété Transactions. Cette propriété renvoie ObservableCollection<TransactionViewModel> et la grille de données utilise cette collection comme source d'éléments. Donc, fondamentalement, chaque ligne est limitée à TransactionViewModel (comme vous pouvez le deviner, cette grille répertorie les transactions). MainWindowsViewModel a ICollectionView qui est utilisé pour le filtrage et le suivi de la ligne actuellement sélectionnée. Le DataGrid a sa propriété IsSynchronizedWithCurrentItem mis à "vrai", alors myCollectionView.CurrentItem me donne le TransactionViewModel actuellement sélectionné.

La seule chose que j'ai encore besoin de savoir est par quelle colonne je dois filtrer. Cela dépend de l'endroit où l'utilisateur a cliqué sur le menu contextuel. Donc, j'essaie de transmettre cette information en utilisant CommandProperty de l'élément de menu contextuel. Et ici j'ai un vrai problème. J'ai essayé ceci:

CommandParameter="{Binding Column.Binding.Path.Path, 
             RelativeSource={RelativeSource FindAncestor, 
                 AncestorType={x:Type tk:DataGridCell}}}" /> 

C'est vraiment laid, mais cela fonctionne pour DataGridTextColumn s. Malheureusement, j'ai également DataGridTemplateColumn s, et ils ne fonctionnent pas (le chemin est différent ici, parce que j'ai besoin d'atteindre le modèle de cellule réelle) ...

Alors, comment puis-je mettre en œuvre cette fonctionnalité? Peut-être que tout le chemin est mauvais? Je n'ai trouvé aucun exemple valable à ce sujet. La seule chose que j'ai trouvé est l'implémentation de WPF DataGrid autofilter sur le CodeProject qui ne fonctionne pas du tout pour une raison quelconque ...

Merci.

Répondre

0

Je ne suis pas 100% sûr que cela contribuerait mais ...

DataGrid a CurrentCell pour que vous puissiez lier en mode TwoWay dans votre MainWindowViewModel. Ensuite, chaque "ligne" pourrait pointer vers la commande DoFilter définie dans MainWindowViewModel. Ce n'est pas une solution de beauté (parce que viewmodel doit connaître le type de cellule DataGrid) mais cela devrait fonctionner.

0

Pourquoi ne pas simplement passer la cellule comme un paramètre comme celui-ci:

CommandParameter= 
    "{Binding RelativeSource={RelativeSource FindAncestor,tk:DataGridCell,1}}" /> 

et laisser gérer l'événement Exécuté de votre commande toute la partie difficile de trouver le nom de la colonne réelle? De cette façon, vous pouvez écrire tout le code spécial dont vous avez besoin.