views:

183

answers:

1

I'm experimenting with IronRuby and WPF and I'd like to write my own commands. What I have below Is as far as I can figure out.

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

But the ICommand interface defines the CanExecuteChanged event. How do I implement that in IronRuby?

Edit: Thanks to Kevin's response

Here's what works based on the 27223 change set of the DLR. The value passed in to can_execute and execute are 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
+4  A: 

It looks like this was implemented by Tomas somewhat recently:

So you may need to compile from the latest source at github

It looks like you need to add a place for the handler to be passed in and stored. Namely, by adding some add_ and remove_ routines for the specific event handler in question. Something like this might work based on your needs (naive, so please test and flesh out):

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
Kevin Radcliffe
This was a big help. Thanks! I added the working solution code to the problem definition.
Ball
Great! In turn, your solution above helped me too. Be sure to join the IronRuby mailing list (if you're not already there): http://rubyforge.org/mail/?group_id=4359
Kevin Radcliffe