Одиночки и ICommand

Существуют ли какие-то особые правила, с которыми я должен быть осторожен при привязке моего представления к командам, определенным в моей одноэлементной модели представления, в отличие от обычных (не одноэлементных) моделей представления?

Все мои 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>

person dotNET    schedule 23.03.2013    source источник


Ответы (1)


Не должно быть никакой разницы в поведении из-за того, что класс следует одноэлементному шаблону. Все, что имеет ссылку на синглтон, не будет заботиться о том, как ограничена конструкция класса, только о том, что экземпляр класса существует.

Проблема, вероятно, заключается в отсутствии надлежащей связи между событием PropertyChanged ViewModel и CanExecuteChanged в команде.

person Flangus    schedule 23.03.2013
comment
:Правильно поставлен диагноз. Огромное спасибо. - person dotNET; 24.03.2013