2013-05-16 88 views
0

我對MVVM和它的東西是全新的。 你能幫我正確地將WPF按鈕綁定到ICommand嗎?用MVVM綁定到ICommand

我綁定按鈕:

<Button Command="{Binding OpenWindow}" > 

在視圖模型:

Public Sub New() 
    OpenWindow = New RelayCommand(New Action(Of Object)(AddressOf ShowWindow)) 
End Sub 

Private Sub ShowWindow() 
    Dim win As New SecondWindow() 
    win.Show() 
End Sub 

和我有類RelayCommand爲:

Public Class RelayCommand 
    Implements ICommand 

    Private ReadOnly _CanExecute As Func(Of Boolean) 
    Private ReadOnly _Execute As Action 

    Public Sub New(ByVal execute As Action) 
     Me.New(execute, Nothing) 
    End Sub 

    Public Sub New(ByVal execute As Action, ByVal canExecute As Func(Of Boolean)) 
     If execute Is Nothing Then 
      Throw New ArgumentNullException("execute") 
     End If 
     _Execute = execute 
     _CanExecute = canExecute 
    End Sub 

    Public Custom Event CanExecuteChanged As EventHandler Implements System.Windows.Input.ICommand.CanExecuteChanged 
     AddHandler(ByVal value As EventHandler) 
      If _CanExecute IsNot Nothing Then 
       AddHandler CommandManager.RequerySuggested, value 
      End If 
     End AddHandler 

     RemoveHandler(ByVal value As EventHandler) 
      If _CanExecute IsNot Nothing Then 
       RemoveHandler CommandManager.RequerySuggested, value 
      End If 
     End RemoveHandler 

     RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
      CommandManager.InvalidateRequerySuggested() 
     End RaiseEvent 
    End Event 

    Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute 
     If _CanExecute Is Nothing Then 
      Return True 
     Else 
      Return _CanExecute.Invoke 
     End If 
    End Function 

    Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute 
     _Execute.Invoke() 
    End Sub 

End Class 

通過上述,我有ViewModel構造函數部分中的一個異常說「嵌套sub沒有與委託'Dele相兼容的簽名門子動作()'。我究竟做錯了什麼?

回答

1

它改成這樣:

OpenWindow = New RelayCommand(New Action(AddressOf ShowWindow)) 

RelayCommand需要不帶參數的作用。你的方法ShowWindow也是一個沒有參數的方法。但是您使用Object類型的一個參數聲明該操作。