2011-03-30 22 views
13

Encontré una clase C# ActionCommand, que implementa ICommand y se basa en delegados para Execute y CanExecute. Me parece perfecto hasta ahora.Traducción de C# ActionCommand: ICommand en VB.net

public class ActionCommand : ICommand 
    { 
    private readonly Action<object> _executeHandler; 
    private readonly Func<object, bool> _canExecuteHandler; 

    public ActionCommand(Action<object> execute, Func<object, bool> canExecute) 
    { 
     if (execute == null) 
     throw new ArgumentNullException("Execute cannot be null"); 
     _executeHandler = execute; 
     _canExecuteHandler = canExecute; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 
    public void Execute(object parameter) 
    { 
     _executeHandler(parameter); 
    } 
    public bool CanExecute(object parameter) 
    { 
     if (_canExecuteHandler == null) 
     return true; 
     return _canExecuteHandler(parameter); 
    } 
    } 

Ahora he traducido en mi variante VB.net necesario (utilizando traductores de código y algunas manos en)

Public Class ActionCommand 
    Implements ICommand 

    Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged 

    Private ReadOnly _executeHandler As Action(Of Object) 
    Private ReadOnly _canExecuteHandler As Func(Of Object, Boolean) 

    Public Sub New(ByVal execute As Action(Of Object), 
       ByVal canExecute As Func(Of Object, Boolean)) 
    If execute Is Nothing Then 
     Throw New ArgumentNullException("Execute cannot be null") 
    End If 
    _executeHandler = execute 
    _canExecuteHandler = canExecute 
    End Sub 

    Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute 
    _executeHandler(parameter) 
    End Sub 

    Public Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute 
    If (_canExecuteHandler Is Nothing) Then 
     Return True 
    End If 
    Return _canExecuteHandler(parameter) 
    End Function 
End Class 

Mi problema es de alrededor de CanExecuteChanged y registrar/mapeo de los eventos de CommandManager.RequerySuggested a CanExecuteChanged. El traductor de código en línea sugieren lo siguiente:

Public Custom Event CanExecuteChanged As EventHandler 
    AddHandler(ByVal value As EventHandler) 
     CommandManager.RequerySuggested += value 
    End AddHandler 
    RemoveHandler(ByVal value As EventHandler) 
     CommandManager.RequerySuggested -= value 
    End RemoveHandler 
End Event 

pero esto no puede satify ICommand.CanExecuteChanged Por favor alguien puede ayudar a cómo traducir o resolver esto?

Respuesta

8

Este artículo de MALIGUI .NET BLOG podría ayudar:

Public Custom Event CanExecuteChanged As EventHandler _ 
    Implements ICommand.CanExecuteChanged 
     AddHandler(ByVal value As EventHandler) 
      Dim handler2 As EventHandler 
      Dim canExecuteCommand = __CanExecuteCommand 
      Do 
       handler2 = canExecuteCommand 
       Dim handler3 = DirectCast(System.Delegate.Combine(handler2, value), EventHandler) 
       canExecuteCommand = Interlocked.CompareExchange((__CanExecuteCommand), handler3, handler2) 
      Loop While (Not canExecuteCommand Is handler2) 
      __CanExecuteCommand = canExecuteCommand 
     End AddHandler 
     RemoveHandler(ByVal value As EventHandler) 
      Dim handler2 As EventHandler 
      Dim canExecuteCommand = __CanExecuteCommand 
      Do 
       handler2 = canExecuteCommand 
       Dim handler3 = DirectCast(System.Delegate.Remove(handler2, value), EventHandler) 
       canExecuteCommand = Interlocked.CompareExchange((__CanExecuteCommand), handler3, handler2) 
      Loop While (Not canExecuteCommand Is handler2) 
      __CanExecuteCommand = canExecuteCommand 
     End RemoveHandler 
     RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) 
      If (__CanExecuteCommand IsNot Nothing) Then 
       __CanExecuteCommand.Invoke(sender, e) 
      End If 
     End RaiseEvent 
    End Event 
+8

La parte alrededor RaiseEvent fue la clave del éxito. Con esto, el evento personalizado puede implementar IComamnd.CanExecuteChanged. Lo simplifiqué de esa manera, que se parece un poco más a la respuesta de MarkJ. – Markus

9
Public Custom Event CanExecuteChanged As EventHandler 
    AddHandler(ByVal value As EventHandler) 
     AddHandler CommandManager.RequerySuggested, value 
    End AddHandler 
    RemoveHandler(ByVal value As EventHandler) 
     RemoveHandler CommandManager.RequerySuggested, value 
    End RemoveHandler 
End Event 
+5

Gracias. Sí, y además con RaiseEvent-Part de HadleyHope, el evento personalizado coincide con la interfaz ICommand – Markus

8

Creo que lo que busca es más como:

Public Custom Event CanExecuteChanged As EventHandler _ 
        Implements ICommand.CanExecuteChanged 
     AddHandler(ByVal value As EventHandler) 
      AddHandler CommandManager.RequerySuggested, value 
     End AddHandler 

     RemoveHandler(ByVal value As EventHandler) 
      RemoveHandler CommandManager.RequerySuggested, value 
     End RemoveHandler 

     RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
      CanExecute(sender) 
     End RaiseEvent 
    End Event 
+0

. He estado buscando esto por un tiempo ... Gracias :) – Alex