【问题标题】:How do I Implement an interface in IronRuby that includes CLR Events如何在 IronRuby 中实现包含 CLR 事件的接口
【发布时间】:2009-08-23 20:35:41
【问题描述】:

我正在试验 IronRuby 和 WPF,我想编写自己的 commands。据我所知,我在下面的内容。

class MyCommand
  include System::Windows::Input::ICommand
  def can_execute()
    true
  end
  def execute()
    puts "I'm being commanded"
  end
end

但是 ICommand 接口定义了 CanExecuteChanged 事件。如何在 IronRuby 中实现它?

编辑:感谢 Kevin 的回复

这是基于 DLR 的 27223 更改集的工作原理。传入can_execute和execute的值都是nil。

class MyCommand
  include System::Windows::Input::ICommand
  def add_CanExecuteChagned(h)
    @change_handlers << h
  end
  def remove_CanExecuteChanged(h)
    @change_handlers.remove(h)
  end
  def can_execute(arg)
     @can_execute
  end
  def execute(arg)
    puts "I'm being commanded!"
    @can_execute = false
    @change_handlers.each { |h| h.Invoke(self, System::EventArgs.new) }
  end
  def initialize
    @change_handlers = []
    @can_execute = true
  end
end

【问题讨论】:

    标签: wpf events ironruby


    【解决方案1】:

    看起来这是由 Tomas somewhat recently 实现的:

    所以你可能需要从github的最新源编译

    看起来您需要为处理程序添加一个位置来传递和存储。即,通过为相关的特定事件处理程序添加一些 add_ 和 remove_ 例程。 这样的事情可能会根据您的需要起作用(天真,所以请测试并充实):

    class MyCommand
      include System::Windows::Input::ICommand
      def add_CanExecuteChanged(h)
        @change_handler = h
      end
    
      def remove_CanExecuteChanged
        @change_handler = nil
      end
    
      def can_execute()
        true
      end
    
      def execute()
        #puts "I'm being commanded"
        @change_handler.Invoke if @change_handler
      end
    end
    

    【讨论】:

    • 这是一个很大的帮助。谢谢!我将工作解决方案代码添加到问题定义中。
    • 太棒了!反过来,您上面的解决方案也帮助了我。请务必加入 IronRuby 邮件列表(如果您尚未加入):rubyforge.org/mail/?group_id=4359
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多