2011-03-30 68 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