J'essaie d'utiliser un indicateur IsDirty pour contrôler les contrôles CanExecute et de navigation pendant une modification d'objet. Le problème est que pour que cela fonctionne je pense que je dois utiliser onPropertyChanged pour ma méthode IsDirty afin que mes contrôles obtiennent une notification de changement (je veux que certains contrôles soient désactivés quand mon objet IsDirty) Malheureusement, je reçois un vilain stackoverflow parce qu'il spirale dans une boucle horrible de IsDirty ... hehe ..Utilisation de IsDirty avec des ICommands
Quelqu'un at-il été en mesure de faire quelque chose de similaire à ce travail? Tout ce que je fais est de mettre IsDirty à true dans ma méthode OnPropertyChanged. Ensuite, dans mes méthodes canExecute, je vois si elle est définie sur true, mais ensuite sur mes contrôles, j'ai besoin de Databind ... qui cause tout le problème. Est-ce que quelqu'un sait comment implémenter quelque chose comme ça?
ceci est ma solution
:: En ViewModelBase
Private _isdirty As Boolean = False
Protected Property IsDirty As Boolean
Get
Return _isdirty
End Get
Set(ByVal value As Boolean)
If _isdirty = Not value Then
_isdirty = value
If _isdirty = True Then
DisableNavigation()
Else
EnableNavigation()
End If
End If
End Set
End Property
Private _haschanges As Boolean
Public Property HasChanges As Boolean
Get
Return _haschanges
End Get
Set(ByVal value As Boolean)
If value = Not _haschanges Then
_haschanges = value
OnPropertyChanged("HasChanges")
End If
End Set
End Property
Protected Sub EnableNavigation()
'Keep from firing multiple onPropertyChanged events
If HasChanges = True Then
HasChanges = False
End If
GetEvent(Of DisableNavigationEvent).Publish(False)
End Sub
Protected Sub DisableNavigation()
'Keep from firing multiple onPropertyChanged events
If HasChanges = False Then
HasChanges = True
End If
GetEvent(Of DisableNavigationEvent).Publish(True)
End Sub
:: En EditViewModelBase DÉRIVÉS de ViewModelBase.
Protected Overrides Sub OnPropertyChanged(ByVal strPropertyName As String)
MyBase.OnPropertyChanged(strPropertyName)
If SetsIsDirty(strPropertyName) Then
If isLoading = False Then
IsDirty = True
Else
IsDirty = False
End If
End If
End Sub
''' <summary>
''' Helps prevent stackoverflows by filtering what gets checked for isDirty
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
''' <remarks></remarks>
Protected Function SetsIsDirty(ByVal str As String) As Boolean
If str = "CurrentVisualState" Then Return False
If str = "TabsEnabled" Then Return False
If str = "IsLoading" Then Return False
If str = "EnableOfficeSelection" Then Return False
Return True
End Function
:: Dans mon viewmodel
Public ReadOnly Property SaveCommand() As ICommand
Get
If _cmdSave Is Nothing Then
_cmdSave = New RelayCommand(Of DoctorOffice)(AddressOf SaveExecute, Function() CanSaveExecute())
End If
Return _cmdSave
End Get
End Property
Private Function CanSaveExecute() As Boolean
'if the object is dirty you want to be able to save it.
Return IsDirty
End Function
Private Sub SaveExecute(ByVal param As DoctorOffice)
BeginWait()
GetService(Of Services.IDoctorOfficesService).Update(SelectedDoctorOffice, False)
EndWait()
End Sub
Pouvez-vous coller l'implémentation de votre propriété IsDirty et des gestionnaires d'événements Execute/CanExecute? –