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

发布于 2024-10-29 05:22:37 字数 2463 浏览 1 评论 0原文

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

  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

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

I found a C# class ActionCommand, that implements ICommand and bases on delegates for Execute and CanExecute. Looks perfect for me so far.

  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);
    }
  }

Now I translated it into my needed VB.net variant (using code translators and some hands on)

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

My problem is around CanExecuteChanged and registering/mapping the events from CommandManager.RequerySuggested to CanExecuteChanged. The online code translator suggest the following:

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

but this cannot satify ICommand.CanExecuteChanged
Can someone please help how to translate or solve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

初见 2024-11-05 05:22:37
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
    AddHandler(ByVal value As EventHandler)
        AddHandler CommandManager.RequerySuggested, value
    End AddHandler
    RemoveHandler(ByVal value As EventHandler)
        RemoveHandler CommandManager.RequerySuggested, value
    End RemoveHandler
End Event
晌融 2024-11-05 05:22:37

我认为您正在寻找的更像是:

    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

I think what you are looking for is more like:

    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
内心激荡 2024-11-05 05:22:37

本文来自 MALIGUI .NET 博客 可能会有所帮助:

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

This article from MALIGUI .NET BLOG might help:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文