0

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

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

虽然所有其他视图都正常运行,在值HasChanges更改时启用/禁用按钮并在单击这些按钮时保存内容,但唯一实现单例模式的 ViewModel 恰好CanExecute仅在第一次加载视图时调用。
之后,PropertyChanged从该 ViewModel(我的所有 ViewModel 实现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>
4

1 回答 1

0

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

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

于 2013-03-23T19:17:51.553 回答