侦听对属性值的更改
创建属性侦听程序
对于句柄类,您可以为预声明的属性事件(命名为:PreSet
、PostSet
、PreGet
、PostGet
)定义侦听程序。要为这些指定事件创建侦听程序,请执行以下操作:
指定
SetObservable
和/或GetObservable
属性特性。定义回调函数
通过在对
addlistener
或event.proplistener
的调用中包含属性和事件的名称来创建属性侦听程序。如有必要,子类化
event.EventData
以创建特化事件数据对象来传递给回调函数。如果新值与当前值相同,则阻止回调的执行(请参阅Assignment When Property Value Is Unchanged)。
设置属性特性以启用属性事件
在属性代码块中,启用 SetObservable
特性。您可以为此代码块中定义的属性定义 PreSet
和 PostSet
侦听程序:
properties (SetObservable) PropOne PropTwo end
定义属性事件的回调函数
当 MATLAB® 触发属性事件时,侦听程序执行回调函数。将回调函数定义为具有两个特定参量的函数,当侦听程序调用函数时,这两个参量会自动传递给函数:
事件源 - 说明作为属性事件源的对象的
matlab.metadata.Property
对象事件数据 - 包含事件信息的
event.PropertyEvent
对象
如有必要,您可以传递附加参量。将此方法定义为 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
属性,采用事件名称作为控制关键字,本例中为 PreSet
或 PostSet
。
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);
有关将函数作为参量传递的详细信息,请参阅创建函数句柄。
属性事件和侦听程序类
以下两个类显示如何为两个属性(PropOne
和 PropTwo
)创建 PostSet
属性侦听程序。
用于生成事件的类
通过指定 SetObservable
属性特性,PropEvent
类启用属性 PreSet
和 PostSet
事件触发。这些属性还启用 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
类定义两个侦听程序:
属性
PropOne
的PostSet
事件属性
PropTwo
的PostSet
事件
您可以使用类似的方式为其他事件或其他属性定义侦听程序。不必为每个侦听程序使用相同的回调函数。有关传递给侦听程序回调函数的参量中包含的详细信息,请参阅 matlab.metadata.Property
和 event.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