Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

WPF MVVM how to call "CanExecute" from the Model?

$
0
0

I've run across a problem while developing my first application that has me a bit stumped.  On my viewModel, I have a standard ICommand which is bound to a button on my View.  The button is intended to allow a user to Save edits to the record they have selected in a ListView.  In the ListView, I have bound "SelectedItem" to the following Property in the viewModel:

        Private _SelectedPTOAccrualRecord As PTOAccrualRateItem
        Public Property SelectedPTOAccrualRecord() As PTOAccrualRateItem
            Get
                Return _SelectedPTOAccrualRecord
            End Get
            Set(ByVal value As PTOAccrualRateItem)
                'Change value
                _SelectedPTOAccrualRecord = value

                'Notify of Property change
                NotifyPropertyChanged("SelectedPTOAccrualRecord")

                'Call CanExecute for SaveAccrualRecordChanges
                Me.SaveAccrualRecordChanges.CanExecute(Nothing)
            End Set
        End Property

Here is PTOAccrualRateItem with just the first Property (the solution should be easily applicable to the others):

    Public Class PTOAccrualRateItem

        Private _PTOAccrualEffectiveDate As Date
        Public Property PTOAccrualEffectiveDate() As Date
            Get
                Return _PTOAccrualEffectiveDate
            End Get
            Set(ByVal value As Date)
                'Check to see if value has been changed
                If value <> _PTOAccrualEffectiveDate Then
                    'Change Value
                    _PTOAccrualEffectiveDate = value

                    'Set HasBeenEdited to True
                    _HasBeenEdited = True
                End If
            End Set
        End Property

Here is the datepicker on the View for PTOAccrualEffectiveDate:

<DatePicker Text="{Binding SelectedPTOAccrualRecord.PTOAccrualEffectiveDate, StringFormat=d}"
            Style="{StaticResource datepickerStandard}" Visibility="{Binding AdminRightsVisibility}"/>

So, when I select the PTOAccrualRecord from the View, the Textbox populates as expected.  I can alter the field and see that the underlying class in my Model is updating the Property.  Here is a simplified version of my CanExecute():

        Private Function CanSaveAccrualRecordChanges(ByVal param As Object) As Boolean
            'Make a record is selected
            If IsNothing(_SelectedPTOAccrualRecord) = True Then
                Return False
            Else
                'Make sure the record has been edited
                If _SelectedPTOAccrualRecord.HasBeenEdited = True Then
                    Return True
                Else
                    Return False
                End If
            End If
        End Function

So, if I switch records in the ListView, CanExecute is raised properly and reevaluates whether the button is enabled.  However, any changes to the underlying properties of SelectedPTOAccrualRecord do not.  I feel like I need to call CanExecute() from my Model, something like this:

        Private _PTOAccrualEffectiveDate As Date
        Public Property PTOAccrualEffectiveDate() As Date
            Get
                Return _PTOAccrualEffectiveDate
            End Get
            Set(ByVal value As Date)
                'Check to see if value has been changed
                If value <> _PTOAccrualEffectiveDate Then
                    'Change Value
                    _PTOAccrualEffectiveDate = value

                    'Set HasBeenEdited to True
                    _HasBeenEdited = True

                    '???? Need to do something here????
                    viewModelFoo.SaveAccrualRecordChanges.CanExecute()
                End If
            End Set
        End Property

Am I thinking about this the right way?  How do you call CanExecute() from the underlying Model when the Icommand is attached to the ViewModel?

Thanks in advance for the help!!




Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>