2013-02-01 1 views
0

J'ai travaillé sur une application WPF qui implique de déplacer de nombreuses formes. Il s'agit principalement de MVVM et repose fortement sur les commandes. Je n'avais pas peur d'annuler/refaire jusqu'à tout récemment. Je ne pense pas que ce sera trop difficile car la plupart de mes changements impliquent des commandes qui héritent d'une classe de base CommandBase qui implémente ICommand.Suivi des paramètres à l'aide d'un motif de commande et d'une commande IC pour Undo/Redo. Stocker plusieurs commandes?

Jusqu'à présent, j'ai ajouté une autre interface nommée IUndoCommand qui utilise ICommand. J'ai ajouté une méthode Undo qui effectuera les opérations nécessaires lorsqu'un appel est annulé.

je vais utiliser une pile pour les défont et refont, mais je suis en cours d'exécution pour un problème avec les paramètres pour les méthodes Execute/Annuler. Existe-t-il un moyen approprié de stocker ces paramètres de type objet? Est-il conseillé d'ajouter un champ/méthode à IUndoCommand? Si oui dois-je mettre dans la méthode Execute ou dans un constructeur (si je peux même.)

Sinon dois-je passer comme son propre objet dans la pile?

En second lieu, (bien que cela peut probablement sa propre question) est-il une meilleure structure de données pour suivre plusieurs commandes? J'ai actuellement une boucle qui exécute plusieurs commandes pour déplacer plusieurs formes sélectionnées et voudrait permettre à une annulation de les annuler toutes. Je suppose que je pourrais convertir ceci en une commande sur lui-même et passer des commandes, mais encore une fois je suis nouveau à ceci et préférerais le faire correctement.

Merci pour la lecture et toute aide serait grandement appréciée.

Sources:

Code Project VisualStudioMagazine StackOverFlow

+0

Avez-vous regardé le Design Pattern Momento? C'est spécifiquement dans le but de défaire. Refaire serait juste l'inverse du modèle que vous avez fait avec les files d'attente. http://en.wikipedia.org/wiki/Memento_pattern –

+0

J'ai vu ça et c'est ce sur quoi j'ai commencé à travailler. J'ai l'impression que cela me donne plus de contrôle et que cela fonctionne mieux avec ce que j'ai déjà fait. J'ai un DrawingEditViewModel qui est défini comme mon datacontext. Cela a des collections observables de viewmodels qui interagissent avec les modèles. Il garde également la trace de mon contenu largeur/hauteur et offest (puisqu'il y a un zoom.) Il y a une possibilité que je puisse déplacer la largeur/hauteur/zoom vers une autre classe, mais il aurait toujours besoin d'y avoir accès. –

+0

Ceci est un problème car la solution la plus simple dans le modèle de conception momento est la copie profonde de l'ensemble du modèle de vue correcte? Cela entraînerait des changements de zoom avant/arrière à enregistrer comme une étape qui serait assez ennuyante. Un utilisateur devrait contrôler + z 8 fois juste pour revenir à sa position de dernière vue. J'espère que cela a du sens .. –

Répondre

1

Depuis l'interface n'a pas besoin d'un accès aux données (il faut juste besoin d'une paire de méthode Undo()/Redo(), et peut-être un drapeau pour savoir si elle peut annuler), il n'a pas besoin de connaître les paramètres du tout.

Une option pourrait être de faire de votre mise en œuvre de IUndoCommand générique. Vous pouvez ensuite l'utiliser pour stocker le paramètre de manière sécurisée.

Votre CommandBase classe pourrait alors être générique, à savoir:

class CommandBase<T> : ICommand, IUndoCommand 
{ 
    // You could then store the parameter directly... 
    public T Parameter { get; private set; } 
} 
+0

Je vois, j'aime cette solution, mais est-ce que je peux la mettre dans la méthode Execute? Je pense que oui, parce que la commande ne sera pas ajoutée à l'une ou l'autre pile à moins qu'Execute ne soit appelé. Je ne suis pas sûr qu'il n'y a pas de meilleur moyen .. –

Questions connexes