2011-03-22 31 views
1

我有一个简单的LoginForm。体面的方式来重新Silverlight MVVM CanExecute?

这里是后台代码的样子:

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命令。

更新乔恩的答案后: 那么,我应该调用此方法从,它应该是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

“LoginCommand”的类型是什么?您至少应该提供这些信息。 – Jon 2011-03-23 00:49:34

+0

@Jon,LoginCommand是一个简单的'DelegateCommand'(或'RelayCommand')。 – Shimmy 2011-03-23 01:12:25

回答

2

这不完全清楚你的目标是什么,所以我希望我得到这个权利。

假设您正在使用Prism,那么只要LoginCommand的可执行状态发生变化(这是从您的ViewModel完成的),虚拟机应立即调用RaiseCanExecuteChanged。这将通知绑定到该命令的所有控件,他们需要重新设置CanExecute状态。

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

在任何情况下,您都无需从视图中进行任何操作。

+0

这实际上是我正在寻找的东西,我只是需要更多的建议如何使用它,请阅读我的问题的更新。 – Shimmy 2011-03-23 06:30:56

+0

@Shimmy:在'IsLoggingIn'的值改变之后调用'RaiseCanExecuteChanged',而不是在'Login'中。如果是属性,请在属性设置器中进行。 – Jon 2011-03-23 11:16:16

+0

我不知道该从哪里调用'RaiseCanExecuteChanged'。当用户更新字段数据(用户名和密码字段)时必须调用它,但Silverlight不允许'UpdateSourceTrigger = PropertyChanged'。 – Shimmy 2011-03-27 05:34:09