在Silverlight MVVM中重新查询CanExecute的体面方式?

时间:2011-03-22 21:48:07

标签: vb.net silverlight-4.0 mvvm

我有一个简单的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

现在我创建了一个公开LoginCommand的LoginViewModel。我想保持代码隐藏,另一方面,保持ViewModel UI独立 最干净的方法应该是什么?

我正在寻找一个应用程序级别的解决方案,因此我可以在尝试点击时将所有控件UpdateSourceTrigger = PropertyChanged或其他任何解决方法重新查询CanExecute命令。

在Jon的回答之后

更新: 那么我应该从哪里调用这个方法,如果它是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 个答案:

答案 0 :(得分:2)

目标还不完全清楚,所以我希望我做对了。

假设您正在使用Prism,那么只要LoginCommand的执行状态发生更改(从ViewModel完成),VM就应立即调用RaiseCanExecuteChanged。这将通知绑定到此命令的所有控件,他们需要重新查询CanExecute状态。

如果你不使用Prism,你的命令类应该有一些类似的机制。

在任何情况下,您都不需要从视图中执行任何操作。