我的GUI由左侧的wx.ListCtrl
和一个要编辑的对象列表以及右侧的一组wx.TextCtrl
组成,用于编辑所选对象。
我实施此计划的策略是:
wx.EVT_KILL_FOCUS
上,更新当前所选对象的相关属性wx.EVT_LIST_ITEM_DESELECTED
上,隐藏文本框或将其删除并禁用它们(当用户单击列表控件中的空格时需要)wx.EVT_LIST_ITEM_SELECTED
上,使用所选对象的属性值填充文本控件使用此设置,有3个用例,其中2个有效:
当用户在文本框之间单击/标签时,会出现正确的wx.EVT_KILL_FOCUS
,并且属性会更新。
当用户从文本框点击列表中的空白区域时,也可以:首先wx.EVT_KILL_FOCUS
导致属性更新,然后wx.EVT_LIST_ITEM_DESELECTED
隐藏文本框。< / p>
问题是当用户直接从文本框单击列表控件中的另一个对象时。在这种情况下,事件的顺序是wx.EVT_LIST_ITEM_DESELECTED
,wx.EVT_LIST_ITEM_SELECTED
,最后是wx.EVT_KILL_FOCUS
。您可能会看到问题:在调用更新属性的方法时,已经选择了一个新对象,并且文本框中已填充了新值。
所以我确切地知道问题是什么,但我无法想出一个好的,干净的方法来解决它。理想情况下,我希望能够改变wx事件的顺序(将wx.EVT_KILL_FOCUS
放在前面),但我怀疑这是可能的。还有其他一些明显的解决方案吗?
答案 0 :(得分:1)
wx.EVT_LIST_ITEM_DESELECTED仅在用户更改列表框中的选定对象时触发。这与失去对文本框的关注的目的相同。同样调用该事件的更新例程。要从文本框中跳过后续的wx.EVT_KILL_FOCUS,请在更新属性后在父对象中设置“isDirty”属性。您可以随时检查isDirty值以确认是否有提交更改。填充新选择的文本框然后在其他文本框事件期间设置时,必须重置此属性。
答案 1 :(得分:1)
在我看来,你正试图从头开始重新实现wxListbook的功能。这似乎很多工作,也许你可以使用wxListbook 做你需要的。