2009-08-23 69 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