Как реализовать интерфейс в IronRuby, включающий события CLR

Я экспериментирую с IronRuby и WPF и хочу написать свой собственный команды. То, что у меня есть ниже, насколько я могу понять.

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

Но интерфейс ICommand определяет событие CanExecuteChanged. Как мне реализовать это в IronRuby?

Изменить: благодаря ответу Кевина

Вот что работает на основе набора изменений 27223 DLR. Значение, переданное в can_execute и execute, равно нулю.

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

person Ball    schedule 23.08.2009    source источник


Ответы (1)


Похоже, это было реализовано Томасом совсем недавно:

Поэтому вам может потребоваться скомпилировать последний исходный код на 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
person Kevin Radcliffe    schedule 24.08.2009
comment
Это было большим подспорьем. Спасибо! Я добавил рабочий код решения в определение проблемы. - person Ball; 24.08.2009
comment
Здорово! В свою очередь, ваше решение выше мне тоже помогло. Не забудьте присоединиться к списку рассылки IronRuby (если вы еще не там): rubyforge.org/mail /? group_id = 4359 - person Kevin Radcliffe; 24.08.2009