Main Content

侦听对属性值的更改

创建属性侦听程序

对于句柄类,您可以为预声明的属性事件(命名为:PreSetPostSetPreGetPostGet)定义侦听程序。要为这些指定事件创建侦听程序,请执行以下操作:

设置属性特性以启用属性事件

在属性代码块中,启用 SetObservable 特性。您可以为此代码块中定义的属性定义 PreSetPostSet 侦听程序:

properties (SetObservable) 
   PropOne
   PropTwo
end

定义属性事件的回调函数

当 MATLAB® 触发属性事件时,侦听程序执行回调函数。将回调函数定义为具有两个特定参量的函数,当侦听程序调用函数时,这两个参量会自动传递给函数:

如有必要,您可以传递附加参量。将此方法定义为 Static 通常很简单,因为这两个参量在其属性中包含最必要的信息。

例如,假设 handlePropEvents 函数是类的一个静态方法,该类为另一个类的对象的两个属性创建侦听程序:

methods (Static)
   function handlePropEvents(src,evnt)
      switch src.Name 
         case 'PropOne'
            % PropOne has triggered an event
         case 'PropTwo'
            % PropTwo has triggered an event
      end
   end
end

另一种可能的方式是在 switch 语句中使用 event.PropertyEvent 对象的 EventName 属性,采用事件名称作为控制关键字,本例中为 PreSetPostSet

Class Metadata提供有关 matlab.metadata.Property 类的详细信息。

将侦听程序添加到属性

addlistener 句柄类方法使您能够将侦听程序关联到属性,而无需将侦听程序对象存储为持久变量。对于属性事件,请使用带四个参量的 addlistener

以下是对 addlistener 的调用:

addlistener(EventObject,'PropOne','PostSet',@ClassName.handlePropertyEvents);

参量如下:

  • EventObject - 生成事件的对象的句柄

  • PropOne - 要侦听的属性的名称

  • PostSet - 要侦听的事件的名称

  • @ClassName.handlePropertyEvents - 引用静态方法的函数句柄,这需要使用类名

如果您的侦听程序回调是普通方法,而不是静态方法,则语法为:

addlistener(EventObject,'PropOne','PostSet',@obj.handlePropertyEvents);

其中 obj 是定义回调方法的对象的句柄。

如果侦听程序回调是非类方法函数,则可以向该函数传递函数句柄。假设回调函数是命名空间函数:

addlistener(EventObject,'PropOne','PostSet',@namespace.handlePropertyEvents);

有关将函数作为参量传递的详细信息,请参阅创建函数句柄

属性事件和侦听程序类

以下两个类显示如何为两个属性(PropOnePropTwo)创建 PostSet 属性侦听程序。

用于生成事件的类

通过指定 SetObservable 属性特性,PropEvent 类启用属性 PreSetPostSet 事件触发。这些属性还启用 AbortSet 特性,如果属性设置为与其当前值相同的值,该属性将阻止属性事件的触发(请参阅Assignment When Property Value Is Unchanged)。

classdef PropEvent < handle
   properties (SetObservable, AbortSet)
      PropOne
      PropTwo
   end
   methods
      function obj = PropEvent(p1,p2)
         if nargin > 0
            obj.PropOne = p1;
            obj.PropTwo = p2;
         end
      end
   end
end

定义侦听程序的类

PropListener 类定义两个侦听程序:

  • 属性 PropOnePostSet 事件

  • 属性 PropTwoPostSet 事件

您可以使用类似的方式为其他事件或其他属性定义侦听程序。不必为每个侦听程序使用相同的回调函数。有关传递给侦听程序回调函数的参量中包含的详细信息,请参阅 matlab.metadata.Propertyevent.PropertyEvent 参考页。

classdef PropListener < handle
   % Define property listeners
   methods
      function obj = PropListener(evtobj)
         if nargin > 0
            addlistener(evtobj,'PropOne','PostSet',@PropListener.handlePropEvents);
            addlistener(evtobj,'PropTwo','PostSet',@PropListener.handlePropEvents);
         end
      end
   end
   methods (Static)
      function handlePropEvents(src,evnt)
         switch src.Name
            case 'PropOne'
               sprintf('PropOne is %s\n',num2str(evnt.AffectedObject.PropOne))
            case 'PropTwo'
               sprintf('PropTwo is %s\n',num2str(evnt.AffectedObject.PropTwo))
         end
      end
   end
end

相关主题