如何在IronRuby中实现包含CLR事件的接口

时间:2009-08-23 20:35:42

标签: wpf events ironruby

我正在尝试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

1 个答案:

答案 0 :(得分:4)

看来这是由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