我想在對象編輯過程中使用IsDirty標誌來控制CanExecute和Navigational控件。使用IsDirty與ICommands
問題是,爲了這個工作,我想我必須使用onPropertyChanged爲我的IsDirty方法,以便我的控件獲取更改通知。(我想要一些控件被禁用時,我的對象IsDirty)不幸的是,我得到討厭的計算器,因爲它盤旋到IsDirty ......嘿嘿的可怕循環..
有沒有人能夠得到一些類似的工作嗎?我所做的就是在我的OnPropertyChanged方法中將IsDirty設置爲true。然後,在我的canExecute方法中,我看到它是否設置爲true,但隨後在我的控件上,我需要Databind ...它導致了所有問題。
沒有人知道如何實現這樣的東西?
這是我的解決方案
::在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
::在EditViewModelBase從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
::在我的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
請粘貼您的IsDirty屬性和Execute/CanExecute事件處理程序的實現嗎? – 2010-07-09 21:51:18