C#ActionCommand的翻译:ICommand到VB.net

我发现了一个C#类ActionCommand,它实现了ICommand并基于Execute和CanExecute的委托。 到目前为止看起来对我来说非

public class ActionCommand : ICommand { private readonly Action _executeHandler; private readonly Func _canExecuteHandler; public ActionCommand(Action execute, Func 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); } } 

现在我将它翻译成我需要的VB.net变体(使用代码翻译器和一些动手)

 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 

我的问题是围绕CanExecuteChanged并将事件从CommandManager.RequerySuggested注册/映射到CanExecuteChanged。 在线代码翻译器提出以下建议:

 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 

但这不能满足ICommand.CanExecuteChanged有人可以帮助如何翻译或解决这个问题吗?

来自MALIGUI .NET BLOG的这篇文章可能有所帮助:

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

我认为你想要的更像是:

  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