我正在尝试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中实现呢?

编辑:感谢凯文的回应

这是基于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

最佳答案

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

10-08 15:53