J'utilise le WPF DataGrid et j'avez SELECUNIT = "cellule" et sélectionMode = "étendu". J'essaie également d'adhérer aux directeurs de MVVM autant que je peux. P>
J'ai besoin de ma viewModel pour garder une trace des cypitans sélectionnés actuels. P>
La vie serait facile si je pouvais simplement lier sa propriété sélectionnée sur mon viewModel. Curieusement, SelectCells est uniquement soulevé une fois - lorsque nous sélectionnerons d'abord une cellule dans la grille. P>
ms l'explique ici: http : //social.msdn.microsoft.com/forums/fr/wpf/thread/737117F4-6D20-4232-88CF-E52CC44D4431 P>
Quelqu'un peut-il penser à une approche conviviale de MVVM pour se déplacer? P>
Merci! P>
4 Réponses :
Quelque part entre les liaisons de MVVM parfaites et le manutention d'événement completdeHinds Il y a la zone grise d'interactivité EventTriggers (voir Blend SDK) :)
Si vous mettez un événement événementiel sur le DataGrid et définissez sur "Selectchangned" et transmettez-les à une commande (utilisez un éventuelMommand Actiontrigger), vous pouvez obtenir les éléments sélectionnés de l'événement eventargs, espérons-le ...
Ou utilisez le multibinage comme indiqué dans le thread MS :) p>
Tdaver: Cela ressemble à une bonne idée, mais d'étrangement suffisamment de chèques de sélection n'est pas tiré lorsqu'une cellule est sélectionnée et que le datagrid est défini sur SelectionMode = Cell, car il le fait quand une ligne est sélectionnée lorsque SelectionMode = "Fullrow". C'est bizarre mais vrai .....
Sélection deschangées ou sélectionnée?
Ouais et un de plus ... Avez-vous besoin des cellules ou des éléments contenus dans votre VM? Le premier n'est pas génial MVVM, mais le premier ne nécessite que la propriété SELECTELITEMS de la propriété non sélectionnée, et je pense que la seconde est soulevée chaque fois qu'une cellule d'une ligne différente est sélectionnée (puisqu'il est le même article si les cellules sont dans la même rangée. .)
J'ai utilisé cette approche et cela fonctionne assez bien avec la lumière MVVM et c'est le moyen le plus rapide aussi .. Sélection de la délectation de 10000 rangées sans attelage !!
Vous pourriez être intéressé par l'application forte> échantillon d'échantillon de
Juste pour ajouter une petite infos pour d'autres lecteurs: l'exemple est basé sur des gestionnaires d'événements de code-derrière qui mettez à jour le point de vue de la vue dans le SelectChangeDevent code>, pas sur la liaison de données entre une propriété ViewModel et le fichier
Datagramrid. SELECTELITEMS CODE> Propriété. Néanmoins utile si quelqu'un ne veut pas suivre des règles MVVM aussi strictes.
Modèle-View-ViewModel (MVVM) est un modèle de conception. Des motifs de conception décrivent comment les objets sont autorisés à interagir. Mais ils n'interdisent pas les aspects comme le code-derrière. Si vous regardez comment la liaison ou les comportements fonctionnent en interne, vous voyez qu'ils appellent également des méthodes sur les images ou les modèles. Ceci n'est pas interdit par MVVM.
Avez-vous besoin de la sélection de données sélectionnée constamment reliées ou simplement lorsque l'utilisateur frappe le bouton OK / Accepter? Si vous n'en avez besoin que à la fin de tout processus, vous pouvez lier les caractères sélectionnés à la propriété CommandParameter d'un bouton, par exemple. Le SelectCells est un IList, et vous en savez suffisamment pour simplement faire une distribution à l'objet Type de sélection de la sélection. L'autre option est Messier, vous pouvez utiliser une propriété attachée, en gardant la manipulation des événements de votre point de vue. Cette propriété attachée manipulerait une liste de liste ou dans votre cas A DataGrid (multisélecteur).
<DataGrid ItemsSource="{Binding Path=SourceList}" myControls:Attach.SelectedItems="{Binding Path=myMvvmSelectedItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Extended" />
J'ai réalisé que ma dernière réponse était pour la sélection de selfiTems au lieu de SelectCells. J'ai donc écrit une classe de propriétés complète pour effectuer une liaison de données pour plusieurs éléments sélectionnés qui fonctionne comme suit:
class DemoViewModel : INotifyPropertyChanged { private IList<DataGridCellInfo> selectedGridCellCollection = new List<DataGridCellInfo>(); public IList<DataGridCellInfo> SelectedGridCellCollection { get { return selectedGridCellCollection; } set { selectedGridCellCollection = value; NotifyPropertyChanged(); } } private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; }
La réponse de T.Webster est bonne si vous utilisez .net4. Apparemment, si vous utilisez .NET.NET3.5 et en prenant le DataGrid de la boîte à outils WPF, il n'y a probablement aucune réponse facile et vous devrez attraper l'événement sélectionné et obtenir manuellement «MyGrid.SelectedCells» et le transmettre à votre viewModel. Je sais que ça sonne boiteux, mais il n'y a probablement pas d'autre moyen ....
Je vérifiai votre grille sa très bonne mais sa forme douloureusement lente si nous avons une case à cocher sélectionnant / désélectionner toutes les colonnes à la fois