2010-08-25 5 views
5

Je travaille sur une application Silverlight LoB dont les concepteurs veulent avoir une interface à onglets, similaire à l'interface de Visual Studio (nous utiliserons probablement les contrôles Telerik Rad pour les onglets d'ancrage). Après avoir fait un prototype, l'interface fonctionne bien jusqu'à présent, mais j'ai des problèmes pour implémenter la fonctionnalité annuler/rétablir dans un projet MVVM.Comment implémenter undo/redo dans une application MVVM?

Undo/fonctionnalité redo doit:

  1. Sur undo/redo, restaurer l'état de l'interface utilisateur, -à-dire mise au point de retour, sélection, etc. pour le contrôle (s) (par exemple une zone de texte) que le changement est originaire de.
  2. Avoir un général, j'utiliser le modèle de commande pile

Undo/Redo per-view, mais je ne suis pas sûr de savoir comment appliquer cela avec MVVM.

Je l'ai utilisé commandant & de liaison pour obtenir le couplage lâche idéalisée des vues & vue-modèles, mais il fait undo/redo beaucoup plus délicat, car la vue modèle n'a pas concept de la vue et l'état de la vue lorsqu'une commande est reçue ou qu'une propriété liée est modifiée. Il semble que j'ai besoin d'un type de suivi de service dont la vue est active chaque fois que l'utilisateur effectue une action annulable et obtient l'état pour une restauration ultérieure. Y at-il un consensus sur ce qui est la meilleure pratique pour implémenter annuler/rétablir dans MVVM? J'ai regardé avec intérêt comment Daniel Vaughan le fait dans son projet de calcium; Blend a apparemment été écrit en utilisant le pattern MVVM et il se comporte exactement comme je le souhaite, ce serait génial si MS m'expliquait comment ils l'ont fait!

Répondre

2

La première chose à faire est de bien séparer les actions de l'interface. Cela signifie que toutes les opérations qui affectent les données doivent être transformées en actions discrètes. Cela implique également que tout ce qui provoque un changement de vue doit également être enregistré comme une action discrète. Fondamentalement, l'état de l'interface ne doit refléter que les changements de données et les changements d'affichage basés sur les commandes (voir ci-dessous ma dernière remarque sur le changement de vue).

Les systèmes d'annulation les plus réussis que nous avons utilisés précédemment permettaient l'imbrication d'objets IUndoableCommand. Ces commandes composées sont regroupées en une seule action utilisateur (le type d'action que vous attendez d'afficher dans un menu Annuler).

Je note que vous mentionnez l'utilisation d'annuler entre vues ... Cela semble un comportement inhabituel pour une application multiforme. Normalement, l'annulation est uniquement dans les contrôles individuels et pour toutes les opérations de glisser-déposer. Les exceptions sont généralement des interfaces graphiques (non basées sur des formulaires). Changer de forme pendant l'annulation serait l'équivalent de MS Word passant à un autre document et continuant à défaire ... assez dérangeant pour l'utilisateur final. Peut-être souhaitez-vous que les utilisateurs découvrent cet aspect de la conception. Juste mon 2 cents.

Espérons que cela aide.

+0

Je vais maintenant aussi étudier le projet de calcium en fonction de votre mention. Merci pour ça. –

+0

Merci pour votre réponse, HiTech. Quand vous dites "annuler est seulement dans les contrôles individuels" voulez-vous dire que, par exemple, sur un formulaire (vue) avec quelques TextBox, l'utilisateur doit se concentrer sur un TextBox où un changement est né pour lui afin d'annuler/refaire Quel changement a-t-il apporté via cette TextBox? Séparer complètement les actions de l'interface - cela ne signifierait-il pas l'interdiction de la liaison TwoWay entre les contrôles de la vue et les propriétés du modèle de vue? Malheureusement, notre application a à la fois une surface de dessin interactive (toile) et des formes comme Blend/VS; c'est complexe. Appréciez vraiment vos pensées! – JamesCo

1

@JamesCo,

J'ai mis undo/redo pour une application WPF et a fini par publier mon undo/redo code à http://muf.codeplex.com/. Vous pouvez également l'obtenir via NuGet. Recherchez simplement "MUF" ou "Monitored Undo Framework". Il inclut le support pour Silverlight 4.0, ainsi que pour .NET 3.5, 4.0 et WP7.

Mon application WPF utilisait également MVVM et, dans certains cas, permettait d'annuler certaines choses, comme des changements de sélection.J'ai également suivi la «page» active qui a été montrée dans le cadre de WPF de sorte que l'utilisateur ait été déplacé vers la page où l'action d'annulation devrait s'appliquer.

La bibliothèque adopte une approche flexible quant à la façon dont vous codez l'action pour annuler/rétablir chaque étape. En fin de compte, il suffit d'un délégué pour annuler et un délégué pour refaire. Vous pouvez demander à ces délégués de faire ce que vous voulez. Inclus dans la bibliothèque est une implémentation par défaut qui prend simplement l'objet, le nom de la propriété, l'ancienne valeur et la nouvelle valeur. Il construit des délégués basés sur la réflexion qui appliqueront les anciennes ou les nouvelles valeurs selon les besoins.

En ce qui concerne l'isolation des modifications pour chaque vue, la bibliothèque vous permet de conserver une pile distincte d'actions d'annulation/rétablissement pour chaque "document" ou "conteneur". Vous passez simplement une référence au conteneur afin d'obtenir la pile d'annulation/rétablissement associée. Enfin, la bibliothèque inclut la prise en charge des modifications groupées ensemble. Ceci est utile dans les cas où plusieurs actions doivent être annulées ensemble en tant qu'unité.

Commentaires et questions sont les bienvenus sur le site codex (http://muf.codeplex.com/). Vous y trouverez également une documentation complète et des exemples d'applications.

Questions connexes