我有一个简单的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
答案 0 :(得分:2)
目标还不完全清楚,所以我希望我做对了。
假设您正在使用Prism,那么只要LoginCommand
的执行状态发生更改(从ViewModel完成),VM就应立即调用RaiseCanExecuteChanged
。这将通知绑定到此命令的所有控件,他们需要重新查询CanExecute
状态。
如果你不使用Prism,你的命令类应该有一些类似的机制。
在任何情况下,您都不需要从视图中执行任何操作。