Как реализовать интерфейс в IronRuby, включающий события CLR - PullRequest
3 голосов
/ 24 августа 2009

Я экспериментирую с 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, равно 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 Ответ

4 голосов
/ 24 августа 2009

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

Так что вам может понадобиться скомпилировать из последнего источника на 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
...