2010-11-24 1 views
2

Il semble y avoir beaucoup de «magie derrière les coulisses» impliquées dans TreeViewDragDropTarget.Comment utilise-t-on TreeViewDragDropTarget MVVM

Tous les messages que j'ai vus jusqu'ici, arrêtez-vous à la présentation de l'arborescence sans expliquer ce qui se passe avec la collecte de données à laquelle TreeView est lié.

Comment TreeViewDragDropTargt communique-t-il avec la propriété ViewModel à laquelle mon TreeView est lié? Existe-t-il des procédures pas à pas orientées MVVM ou des didacticiels sur TreeView Drag and Drop ala MVVM?

MISE À JOUR: "If an item is dropped onto the drag drop target, it is added to the nested control if the nested control is bound to an ObservableCollection (or any collection that implements INotifyCollectionChanged and contains the same type of items as the item that was dropped)."

Et ce que cela signifie est que je peux accrocher dans l'événement CollectionChanged du ObservableCollection mon TreeView est tenu de maintenir mon modèle en synchronisation.

Existe-t-il une meilleure option?

+0

Vous savez, vous pouvez toujours utiliser du code, ce n'est pas interdit par l'approche MVVM, c'est une bonne habitude de ne pas utiliser le code derrière si vous n'en avez pas besoin. – Rumplin

+0

@Rumplin Point pris. Le problème avec cette question est que le modèle mvvm est fondamentalement lié au fait que la VM a la part du lion dans la responsabilité des données, mais dans ce cas, il est difficile d'informer la VM des changements apportés à ces données. –

+0

vous pouvez utiliser Messenger pour envoyer des données à partir du code derrière votre machine virtuelle – Rumplin

Répondre

1

Je n'ai pas vu une meilleure option jusqu'à présent. Rappelez-vous que le point derrière les modèles MVC/MVP/MVVM est de mettre autant de code que possible sous test. Pour le glisser/déposer, j'ai utilisé le message Présentation -> Code Derrière -> Messenger Raise "Items Added" ... et attraper l'événement à partir du ViewModel. Par exemple, s'il existe une logique personnalisée dans le Code Behind, par exemple, valider que la "source" a un statut valide, ou du bon type etc, vous pouvez déléguer cette vérification dans un "service" (Dependency Injected) qui serait spécialisé dans la gestion de ces cas bizarres. Le Code Behind devient miminal, et le "drag service" devient testable.

Avez-vous vraiment besoin d'un "Drag Service", et si oui, devriez-vous avoir un "Drag Service" par ViewModel, ou un par application? Je vais répondre avec votre réponse classique "Cela dépend".