单身人士和ICommand

时间:2013-03-23 17:41:20

标签: wpf vb.net mvvm singleton icommand

在将我的视图绑定到我的单例ViewModel中定义的命令时,我是否需要注意一些特殊规则,而不是普通(非单例)ViewModel?

我所有的ViewModel除了有问题之外都表现正常。它们中的每一个都公开了两个名为HasChanges(bool属性)和SaveChanges(方法)的公共成员,我在我的命令的CanExecuteExecute函数中调用它们。

虽然所有其他视图行为正常,但当HasChanges的值更改并在单击这些按钮时保存内容时启用/禁用按钮,实现Singleton模式的唯一ViewModel恰好调用CanExecute仅在第一次加载视图时 之后,从该ViewModel(我的所有ViewModel实现PropertyChanged)中引发的任意数量的INotifyPropertyChanged事件都不会影响按钮的禁用状态。

想知道我在这里缺少什么。

这是单身模型:

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>

1 个答案:

答案 0 :(得分:0)

由于类遵循单例模式,因此行为应该没有任何差异。任何引用单例的东西都不会关心如何限制类的构造,只关注类的实例是否存在。

问题可能在于ViewModel的PropertyChanged事件与Command上的CanExecuteChanged之间缺少正确的链接。