0

通常の (シングルトンではない) ViewModel とは対照的に、ビューをシングルトン ViewModel で定義されたコマンドにバインドする際に注意しなければならない特別なルールはありますか?

問題のViewModelを除くすべてのViewModelは正常に動作します。HasChangesそれらのそれぞれは、 (bool プロパティ) とSaveChanges(メソッド) という2 つのパブリック メンバーを公開します。これらは、コマンドの関数CanExecuteExecute関数で呼び出しています。

他のすべてのビューは正常に動作し、値が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>
4

1 に答える 1

0

クラスがシングルトン パターンに従うため、動作に違いはありません。シングルトンへの参照を伴うものは、クラスの構築がどのように制限されているかを気にせず、クラスのインスタンスが存在することだけを気にします。

問題は、ViewModel の PropertyChanged イベントと Command の CanExecuteChanged の間に適切なリンクがないことにあると考えられます。

于 2013-03-23T19:17:51.553 に答える