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?
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