2009-08-23 8 views
3

J'expérimente IronRuby et WPF et j'aimerais écrire le mien commands. Ce que j'ai ci-dessous est aussi loin que je peux comprendre.Comment implémenter une interface dans IronRuby qui inclut des événements CLR

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

Mais l'interface ICommand définit l'événement CanExecuteChanged. Comment puis-je l'implémenter dans IronRuby?

Edit: Merci à la réponse

Kevin Voici ce qui fonctionne basé sur l'ensemble 27223 de changement de la DLR. La valeur transmise à can_execute et execute est nulle.

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 

Répondre

4

On dirait que cela a été mis en œuvre par Tomas somewhat recently:

Vous devrez peut-être compiler à partir de la dernière source au niveau github

Il semble que vous avez besoin d'ajouter un endroit pour le gestionnaire de être passé et stocké. A savoir, en ajoutant des routines add_ et remove_ pour le gestionnaire d'événement spécifique en question. Quelque chose comme cela pourrait fonctionner en fonction de vos besoins (naïfs, donc s'il vous plaît tester et étoffer):

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 
+0

Ce fut une grande aide. Merci! J'ai ajouté le code de la solution de travail à la définition du problème. – Ball

+0

Super! À son tour, votre solution ci-dessus m'a aidé aussi. Assurez-vous de joindre la liste de diffusion IronRuby (si vous n'êtes pas déjà là): http://rubyforge.org/mail/?group_id=4359 –