Достойный способ запросить CanExecute в Silverlight MVVM? - PullRequest
1 голос
/ 23 марта 2011

У меня простая LoginForm.

Вот как выглядит код:

Private Sub btnLogin_Click(sender As Object, e As RoutedEventArgs) _
  Handles btnLogin.Click
    If Me.loginForm.ValidateItem() Then
      'Do the actual login - (calling VM command)
      DirectCast(Me.DataContext, LoginViewModel).LoginCommand.Execute()
    End If
End Sub

Теперь я создал LoginViewModel, который представляет LoginCommand. Я хотел бы сохранить чистоту кода, а с другой стороны, оставить независимым интерфейс ViewModel.
Какой должен быть самый чистый способ сделать это?

Я ищу решение на уровне приложения, чтобы я мог сделать все элементы управления UpdateSourceTrigger = PropertyChanged или другой обходной путь для запроса команды CanExecute при попытке щелчка.

Обновление после ответа Джона: Так откуда я должен вызывать этот метод, должен ли он быть Login?

Private m_LoginCommand As ICommand
Public ReadOnly Property LoginCommand() As ICommand
  Get
    If m_LoginCommand Is Nothing Then m_LoginCommand =
      New DelegateCommand(AddressOf Login, AddressOf CanLogin)
    Return m_LoginCommand
  End Get
End Property
Private Function CanLogin() As Boolean
  Return Not IsLoggingIn
End Function
Private Sub Login()
  DirectCast(LoginCommand, DelegateCommand).RaiseCanExecuteChanged()
  If Not CanLogin() Then Exit Sub
  'Do login
End Sub

1 Ответ

2 голосов
/ 23 марта 2011

Не совсем ясно, какова ваша цель, поэтому я надеюсь, что понял это правильно.

Если вы используете Prism, то всякий раз, когда LoginCommand меняет статус can-execute (которыйсделано из вашей ViewModel), виртуальная машина должна немедленно вызвать RaiseCanExecuteChanged.Это уведомит все элементы управления, которые привязываются к этой команде, о том, что они должны запрашивать статус CanExecute.

Если вы не используете Prism, ваш командный класс должен иметь некоторый аналогичный механизм.

Inв любом случае вам не нужно ничего делать с помощью View.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...