上回说到数据与界面基本分离, 并可以进行单元测试.
这次的目标是仿照MVVM的模式, 进行数据和事件的绑定, UI与事件分离.
首先, 新建一个MyViewModel类,来保存数据和事件函数. UI需要更新Lebel, 需要监听MyViewMode中数据更新.因此引进了观察者模式.
Code Snippet
- class wxString;
- struct ISystemEventListener
- {
- virtual void OnSystemEvent(const wxString& propertyName) = 0;
- };
-
- struct ISystemEventDispatcher
- {
- virtual bool RegisterListener(ISystemEventListener* pListener) = 0;
- virtual bool RemoveListener(ISystemEventListener* pListener) = 0;
- virtual void OnSystemEvent(const wxString& propertyName) = 0;
- };
这样在MyViewModel中保存其成员就可以监听事件了. MyViewModel方法如下
Code Snippet
- class MyViewModel
- {
- public:
- void OnClickButton(wxCommandEvent& event);
- wxString m_Name;
- SystemEventDispatcherImp m_Listener;
在UI类MyDialog需要继承观察者接口, 然后建立如下模板, 就可以对数据和更新事件的进行监听
Code Snippet
- template<class T>
- void MyDialog::SetViewData( boost::shared_ptr<T> pViewModel )
- {
- wxStaticText* pText = (wxStaticText*) FindWindow(ID_LABEL);
- pText->SetValidator(wxGenericValidator(&(pViewModel->m_Name)));
-
- pViewModel->m_Listener.RegisterListener(this);
- }
最后一步, 把MyViewModel中的事件函数绑定到MyModel的button上. 可以使用wxWidgets的方式, 对MyDialog压入EventHandler, 如下
MyViewDialog继承自wxEvtHandler, 并绑定事件. 完整MyViewDialog如下
Code Snippet
- class MyViewModel: public wxEvtHandler
- {
- public:
- MyViewModel(void);
- ~MyViewModel(void);
- void OnClickButton(wxCommandEvent& event);
- wxString m_Name;
- SystemEventDispatcherImp m_Listener;
- private:
- DECLARE_EVENT_TABLE()
- };
Code Snippet
- BEGIN_EVENT_TABLE(MyViewModel, wxEvtHandler)
- EVT_BUTTON(ID_BUTTON, MyViewModel::OnClickButton)
- END_EVENT_TABLE()
- void MyViewModel::OnClickButton( wxCommandEvent& event )
- {
- m_Name = MyData::GetName();
- m_Listener.OnSystemEvent(_T("Name"));
- }
接下来修改 MyDialog::SetViewData 函数 调用PushEventHandler()即可. 如下
Code Snippet
- template<class T>
- void MyDialog::SetViewData( boost::shared_ptr<T> pViewModel )
- {
- wxStaticText* pText = (wxStaticText*) FindWindow(ID_LABEL);
- pText->SetValidator(wxGenericValidator(&(pViewModel->m_Name)));
-
- PushEventHandler(pViewModel.get());
-
- pViewModel->m_Listener.RegisterListener(this);
- }
先在基本完成.但
1. 以m_Name绑定ViewMode中的数据, 这个依赖不好
2. MVVM模式有UI的配置文件, 可以填写属性自动绑定ViewModel类, wxWidgets也有xml的配置文件, 是不是也可以这样做呢
下一回就以上边的两点为目标.
阅读(631) | 评论(2) | 转发(0) |