代码之家  ›  专栏  ›  技术社区  ›  Ball

如何在IronRuby中实现包含clr事件的接口

  •  3
  • Ball  · 技术社区  · 16 年前

    我正在试验IronRuby和WPF,我想写我自己的 commands . 我下面所说的是我所能理解的。

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

    但ICommand接口定义了CanExecuteChanged事件。我如何在IronRuby中实现它?

    编辑:感谢凯文的回应

    下面是基于DLR的27223变更集的工作原理。传递给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
    
    1 回复  |  直到 16 年前
        1
  •  4
  •   Kevin Radcliffe    16 年前

    看起来这是由Tomas实现的 somewhat recently :

    因此,您可能需要从 github

    看起来您需要为要传入和存储的处理程序添加一个位置。也就是说,通过为相关的特定事件处理程序添加一些“添加”和“删除”例程。 类似这样的事情可能会根据您的需求(幼稚,所以请测试并充实):

    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