minigui/mgncs:数据绑定(databinding)的应用

所谓数据绑定(databinding)是面向对象程序设计言(OOP)的一种系统设计方法,一些高级语言(比如java)开发框架(比如jface)就提供了数据绑定功能。就是在不同的对象之间建立事件(event)驱动的一种关联,当一个对象的数据发生变化时另一个对象的数据同步发生变量而不需要人为设计和干预,具体到应用层开发,有了数据绑定功能就可以让UI界面中用户操作带来的数值变化自动同步到应用数据对象中,而不再需要针对每个数据关联进行设计,带来的好处是提高开发效率,增强代码的稳定性,减少模块间的藕合。
miniguimgncs库也提供了数据绑定功能。虽然mgncs提供的数据绑定功能不如高级语言开发框架那么强大。但也提供基本的数据自动同步和简单的数据类型转换(int–string)。

mgncs的databind框架是基于mObject类基础上的,理论上只要是mObject的子类都可以适用于mgncs的databind框架。但是到目前为止,mgncs只对mComponent有及其子类提供了直接的数据绑定调用支持。
另外对于整数和字符串类型(char*int)也提供了直接的数据绑定支持。
下面的代码片段,演示如何将一个CheckButton的状态与一个string类型指针同步:

    // 数据绑定测试
    static char check_state_str[16]="1";
    // 根据控件id获取子控件对象(mCheckButton)
    mWidget * us_enable = ncsGetChildObj(self->hwnd,ID_CHECKBUTTON_US_ENABLE);
    // 生成mComponent控件us_enable 的数据绑定对象
    mBindProp* bind_com = NCS_CMPT_PROP (us_enable,
            NCSN_BUTTON_STATE_CHANGED,/* 指定数据绑定的事件ID */
            NCSP_BUTTON_CHECKSTATE,/* 指定数据绑定的属性ID,这里为控件的check状态 */
            NCS_BT_INT,/* 指定控件状态的数据类型为整数 */
            NCS_PROP_FLAG_READ|NCS_PROP_FLAG_WRITE /* 指定数据绑定对象的访问属性(可读/可写) */
        );
    // 上面的的调用定义了一个mBindProp对象
    // 意思就是对于按钮us_enable 当NCSN_BUTTON_STATE_CHANGED消息产生时读取该按钮
    // 的NCSP_BUTTON_CHECKSTATE属性。
    /* 对字符串数组 check_state_str 创建数据绑定对象 */
    mBindProp* bind_var = ncsRegisterVariableBindProp(
        check_state_str, 
        NCS_BT_STR, /* 指定控件状态的数据类型为字符串 */
        NCS_PROP_FLAG_READ|NCS_PROP_FLAG_WRITE/* 指定数据绑定对象的访问属性(可读/可写) */);
    /* 将上面创建的两个mBindProp对象连接在一起, bind_com为源,bind_var为目标 * us_enable 的check状态与check_state_str 字符串的值自动同步 */
    ncsConnectBindProps(bind_com,bind_var,
        NCS_BPT_DBL /* 定义数据同步方向为双向 */
        );
    // 将check_state_str的值(字符串“1”)同步到bind_com ,
    // 本例中就是将us_enable 的check状态(NCSP_BUTTON_CHECKSTATE)置为1(整数),
    // 这中间的数据类型转换由databind框架自动完成
    ncsAutoReflectObjectBindProps ((mObject*)check_state_str);

上面的例是将一个mComponent的属性和一个string进行数据绑定,进一步扩展,也可以在两个mComponent之间或两个string之间进行数据绑定。

删除数据绑定

调用ncsRegisterVariableBindPropncsRegisterComponentBindProp函数创建的数据绑定对象(mBindProp)也是一个内存对象。当不用的时候需要调用ncsRemoveObjectBindProps函数释放资源。以免内存泄露。

需要说明的是,如果是ncsRegisterComponentBindPropmComponent创建的数据绑定对象不需要显式调用ncsRemoveObjectBindProps函数删除绑定,因为对象mObject在析构(destroy)时会自动调用ncsRemoveObjectBindProps函数删除与当前对象相关的所有数据绑定。
但是ncsRegisterVariableBindProp创建的数据绑定对象(mBindProp)并不会被自动释放。所以需要调用者负责释放。

你可能感兴趣的:(minigui,MiniGUI)