20 votes

Comment annuler la modification d'un objet en utilisant MVVM ?

Comment puis-je mettre en œuvre l'annulation de l'édition d'un objet en utilisant MVVM.

Par exemple : J'ai une liste de clients. Je choisis un client et clique sur le bouton "Editer", une fenêtre de dialogue (DataContext est lié à CustomerViewModel) s'ouvre et je commence à modifier les champs du client. Et puis je décide d'annuler l'édition, mais les champs du client ont déjà été modifiés, alors comment puis-je ramener un client à son état précédent en MVVM ?

13voto

Kent Boogaart Points 97432

Consultez le IEditableObject interface. Votre Customer devrait implémenter cela, et vos commandes peuvent exécuter BeginEdit / CancelEdit / EndEdit le cas échéant.

4voto

Agies Points 847

Un moyen très simple, si votre objet est déjà sérialisable, par exemple si vous utilisez WCF. Vous pouvez sérialiser votre objet original dans un champ interne. Si, votre objet n'est pas sérialisable, alors utilisez simplement AutoMapper pour créer une copie de votre objet avec une seule ligne de code.

Order backup = Mapper.Map<Order, Order>(order);

Lorsque vous traitez votre CancelCommand, il suffit d'appeler AutoMapper en sens inverse. Puisque vos propriétés ont déjà une notification de changement, tout fonctionne. Il est possible de combiner ces techniques avec IEditableObject, si vous en avez besoin et si vous voulez écrire le code supplémentaire.

4voto

Vous pouvez utiliser la liaison avec UpdateSourceTrigger=Explicit . Ici vous pouvez trouver plus d'informations sur la façon dont cela peut être mis en œuvre.

3voto

Eduardo Molteni Points 23135

Sur cet article Raul a juste rechargé l'objet depuis la base de données. Je suppose que c'est moins problématique que la solution proposée par Kent.

    internal void Cancel(CustomerWorkspaceViewModel cvm)
    {
        Mainardi.Model.ObjectMapping.Individual dc = cvm.DataContext 
                                 as Mainardi.Model.ObjectMapping.Individual;

        int index = 0;

        if (dc.ContactID > 0 && dc.CustomerID > 0)
        {
            index = _customerCollectionViewModel.List.IndexOf(dc);
            _customerCollectionViewModel.List[index] = 
                                  _customerBAL.GetCustomerById(dc.CustomerID);
        }

        Collection.Remove(cvm);
    }

1voto

Silas Points 1130

Sur la base de Réponse de la Commission :

Vous pouvez indiquer que vos liaisons doivent être mises à jour manuellement en définissant les paramètres suivants

<TextBox Name="yourTextBox" Text="{BindingPath=YourBinding, UpdateSourceTrigger=Explicit}" />

dans votre vue (XAML). Ensuite, vous devez écrire les changements de votre interface utilisateur dans le ViewModel en appelant

yourTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
lorsque l'on clique sur Enregistrer.

Veuillez noter que si des mises à jour de la source de liaison sont déclenchées à partir d'autres éléments, elles sont toujours affichées directement dans l'interface utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X