Существуют ли какие-то особые правила, с которыми я должен быть осторожен при привязке моего представления к командам, определенным в моей одноэлементной модели представления, в отличие от обычных (не одноэлементных) моделей представления?
Все мои ViewModels, кроме рассматриваемой, ведут себя нормально. Каждый из них предоставляет два общедоступных члена с именами HasChanges
(логическое свойство) и SaveChanges
(метод), которые я вызываю в функциях CanExecute
и Execute
моих команд.
В то время как все другие представления ведут себя нормально, включая/отключая кнопки при изменении значения HasChanges
и сохраняя содержимое при нажатии этих кнопок, единственная ViewModel, которая реализует шаблон Singleton, вызывает CanExecute
только при первой загрузке представления.
После этого любое количество событий PropertyChanged
, вызванных внутри этой ViewModel (все мои модели ViewModel реализуют INotifyPropertyChanged
), не влияет на отключенное состояние кнопки.
Интересно, чего мне здесь не хватает.
Вот одноэлементный ModelView:
Public NotInheritable Class MyViewModel
Private Shared ReadOnly mInstance As New CommonListsViewModel
Public Shared ReadOnly Property Instance() As CommonListsViewModel
Get
Return mInstance
End Get
End Property
Public Property SaveChangesCommand As ICommand
Private Sub New()
SaveChangesCommand = New Commands.SaveChangesCommand()
End Sub
Public ReadOnly Property HasChanges As Boolean Implements IEditorViewModel.HasChanges
Get
...
End Get
End Property
Public Function SaveChanges() As Boolean Implements IEditorViewModel.SaveChanges
...
End Function
End Class
Вот команда:
Friend Class SaveChangesCommand
Inherits CommandBase
Public Overrides Function CanExecute(parameter As Object) As Boolean
Return MyViewModel.Instance.HasChanges
End Function
Public Overrides Sub Execute(parameter As Object)
MyViewModel.Instance.SaveChanges()
End Sub
End Class
И вот мой взгляд:
<Grid DataContext="{x:Static local:CommonListsViewModel.Instance}">
<Button Command="{Binding SaveChangesCommand}">
</Grid>