通常の (シングルトンではない) ViewModel とは対照的に、ビューをシングルトン ViewModel で定義されたコマンドにバインドする際に注意しなければならない特別なルールはありますか?
問題のViewModelを除くすべてのViewModelは正常に動作します。HasChanges
それらのそれぞれは、 (bool プロパティ) とSaveChanges
(メソッド) という2 つのパブリック メンバーを公開します。これらは、コマンドの関数CanExecute
とExecute
関数で呼び出しています。
他のすべてのビューは正常に動作し、値がHasChanges
変更されたときにボタンを有効/無効にし、それらのボタンがクリックされたときにコンテンツを保存しますが、Singleton パターンを実装する唯一の ViewModelCanExecute
は、ビューの最初の読み込み時にのみ呼び出されます。
その後、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>