Question

Je prévois de créer un scénario maître-détail typique, à savoir une collection d'éléments affichés dans une ListView via DataBinding à un ICollectionView, et des détails sur l'élément sélectionné dans un groupe distinct des contrôles (TextBoxes, NumUpDowns ...).

Pas de problème jusqu'à présent, en fait je l'ai déjà mis en place un scénario assez similaire dans un projet plus ancien. Cependant, il devrait être possible de sélectionner plusieurs éléments dans le ListView et obtenir les appropriées valeurs partagées affichées dans la vue détaillée. Cela signifie, si tous les éléments sélectionnés ont la même valeur pour une propriété, cette valeur doit être affichée dans la vue détaillée. S'ils ne partagent pas la même valeur, la commande correspondante devrait fournir un indice visuel pour l'utilisateur indiquant cela, et aucune valeur ne doit être affichée (ou un état « non défini » dans un CheckBox par exemple). Maintenant, si l'utilisateur modifie la valeur, ce changement doit être appliqué à tous éléments sélectionnés.

D'autres exigences sont:

  • compatibilité MVVM (à savoir pas trop de code-behind)
  • (nouvelles propriétés possibilités d'extension / types peuvent être ajoutés plus tard)

Quelqu'un at-il une expérience avec un tel scénario? En fait, je pense que cela devrait être un scénario très commun. Cependant, je ne pouvais pas trouver tous les détails sur ce sujet partout.

Merci!
gehho.

PS: Dans le projet plus mentionné ci-dessus, j'avais une solution en utilisant une sous-classe de la ViewModel qui gère le cas particulier de la multi-sélection. Il a vérifié tous les éléments sélectionnés pour l'égalité et retourne les valeurs appropriées. Cependant, cette approche a eu quelques inconvénients et en quelque sorte semblait être un hack parce que (en plus d'autres choses malodorantes), il était nécessaire de rompre la synchronisation entre le ListView et la vue détaillée et gérer manuellement.

Était-ce utile?

La solution

Dans votre ViewModel, créez une propriété qui va se lier aux SelectedItems de votre ListView.

Créer une autre propriété qui représentera l'objet de détails de vos éléments sélectionnés.

La section des détails (dans le XAML) est obligatoire à cette Détails (dans le ViewModel).

Chaque fois que les éléments sélectionnés collection est modifié (événement setter / CollectionChanged), vous devez mettre à jour vos coordonnées objet aussi bien (qui itérer les propriétés pertinentes et décider si elles sont de la même valeur ou non).

Une fois une propriété dans les détails objet est modifié, vous devez itérer retour sur vos articles sélectionnés collection et faire les changements pertinents sur eux.

Voilà.

it helps

Autres conseils

Je suis en cours d'exécution dans ce même problème exactement.

IsSynchronizedWithCurrentItem = "True" ne garde que la CurrentItem en synchronisation (le dernier élément que vous avez sélectionné sans tenir ctrl ou shift).

Comme vous avez probablement, j'ai cherché loin l'Internet pour une réponse et ne jamais venu avec un. Mon scénario a un Master 3 niveaux> Détail> Détail obligatoire, où chaque niveau est lié à son propre ListBox.

J'ai bricolé quelque chose qui fonctionne pour le moment.

Pour mon maître> Détail> niveaux de détail J'ai créé un CollectionViewSource individuel pour chaque niveau et établi que CollectionViewSource.Source à l'objet entité appropriée. Sur l'événement de ListBox lié MasterView SelectionChanged je fis un filtre sur le MasterView.View pour récupérer des objets où le maître clé primaire = Détail clé étrangère.

Il est bâclée, mais si vous avez trouvé une meilleure façon de réaliser ce but, je serais ravi de l'entendre.

Je l'ai utilisé une approche similaire à

scroll top