Bonjour à tous,
Je ne trouve pas de solution satisfaisante à mon problème, une aide me serait vraiment bienvenue.

J'ai un objet 'Equipement' qui signale tout ses changements à la BLL ainsi qu'à l'UI principale au travers d'un event 'PropertyChanged'.
La BLL se charge de calculer cette objet intégralement lors de chaque changement d'une de ses propriétés. A ce niveau là il n'est pas possible d'annuler la modification mais cela ne me dérange pas.

J'ai aussi un formulaire d'édition que j'appelle lorsque je veux créer ou modifier un 'équipement', je lui passe donc en paramètre l'objet à modifier. Celui-ci dispose de 2 boutons 'OK' et 'Annuler'
L'es contrôles de ce formulaire appellent la procédure de calcul de la BLL de manière à afficher les résultats immédiatement sur ce dernier.

Dans ce formulaire je travaille directement sur l'objet 'Equipement' (passé en argument par référence) car celui ci dispose de beaucoup de propriété et je souhaite éviter des recréer une variable pour chaque propriété.
Et donc voici le problème qui se pose : les résultats des calculs sont écrits directement dans l'objet sans avoir la possibilité d'annuler.

J'ai imaginé de cloner l'objet pour éviter ca mais je ne sais pas du tout si c'est une bonne idée, si cela est possible, et comment...

Si c'est un problème d'architecture du programme qui se pose, je suis prêt à faire quelques modifications mais pas trop grosse car le programme est presque fini.
Merci beaucoup.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Equipement
        Inherits BaseElement
        Private _Prop1 As Single
        Private _Prop2 As Single
        Private _Prop3 As Single
Public Property Prop1 As Single
            Get
                Return _Prop1
            End Get
            Set(ByVal value As Single)
                _Prop1 = value
                MyBase.OnPropertyChanged()
            End Set
End Property
' ... etc
End Class

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Class BLLProjet
Friend Sub OnEquipementPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
            Static Dim EventAlreadyActive As Boolean
            If EventAlreadyActive Then Exit Sub ' Evite les appels récursifs lors des changements de propriétés.
 
            Dim Equipement As Equipement = CType(sender, Equipement)
            Dim PropName As String = e.PropertyName
 
            EventAlreadyActive = True
            RecalculEquipementObject(Equipement)
            EventAlreadyActive = False
 
End Sub
Public Sub RecalculEquipementObject(Equipement As Equipement)
            With Equipement
               .Prop3 = .Prop1 + .Prop2
                ' ... etc
 
 
            End With
        End Sub
End Class
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 frmEditEquipement.ShowDialog(MonEquipement)