2011-03-30 78 views
13

我发现了一个C#类ActionCommand,它实现了ICommand并以Execute和CanExecute的委托为基础。到目前为止我看起来非常完美。C#ActionCommand:ICommand到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); 
    } 
    } 

现在我把它翻译成我需要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 

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

回答

8

这从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 
+8

周围的RaiseEvent的部分是成功的关键。有了这个,自定义事件可以实现IComamnd.CanExecuteChanged。我以这种方式简化了它,它看起来更像MarkJ的答案。 – Markus 2011-03-30 12:41:40

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

谢谢。是的,除了HadleyHope的RaiseEvent-Part之外,自定义事件与接口ICommand匹配 – Markus 2011-03-30 12:43:51

8

我想你在找什么更像是:

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

我一直在寻找这一段时间......谢谢:) – Alex 2013-11-05 16:25:03