2009-08-23 45 views
3

我正在试验IronRuby和WPF,并且我想写我自己的commands。我所知道的下面是我所能想到的。如何在IronRuby中实现包含CLR事件的接口

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 

回答

4

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

这是一个很大的帮助。谢谢!我将工作解决方案代码添加到问题定义中。 – Ball 2009-08-24 13:23:10

+0

太棒了!反过来,你的解决方案也帮助了我。请务必加入IronRuby邮件列表(如果您还不在):http://rubyforge.org/mail/?group_id=4359 – 2009-08-24 15:17:11