我有一个自定义对象列表,我已将其添加到我的 WinForms C# 4.0 应用程序中的 ListBox 控件中。
当用户在 ListBox 中选择特定元素时,该对象的属性会出现在各个输入字段中 ListBox 旁边的窗口中。用户可以更改这些并单击“保存”,这将修改对象的数据成员以与用户所做的更改相对应。
该功能确实有效。值被保存到对象中,当用户再次选择该元素时,他们的更改被确认正确保存。
不起作用的是列表框中文本的更新。例如,如果我们在 ListBox 中有一个员工列表,我们可以在那里看到“John Smith”,我们可以单击他的名字 - 将他的名字编辑为“John Smithe”,然后单击“确定”。 ListBox 仍然显示“John Smith”,但是如果我们单击他的名字,那么在右侧的 TextBoxes 中我们可以看到他的名字已正确更改为“John Smithe”。
我试过在 ListBox 上调用 Refresh() 方法,但这没有用。
我可以通过从 ListBox 中删除项目并再次添加来修复它。这行得通,而且这不是真正的问题,因为这些项目无论如何都存储在单独的列表中,所以我没有失去任何员工的风险。
但这真的是最好的方法吗?有没有更优雅的方法来更新 ListBox 中的文本而无需再次删除/添加项目?
最佳答案
ListBox
中的对象是否实现 INotifyPropertyChanged
?
更新:
看来你可以通过几个步骤解决问题:
- 将
ListBox
的DisplayMember
属性设置为您的对象的一个属性,该属性提供您希望在列表中显示的任何内容。对于这个答案,我假设此属性被命名为DisplayText
。 - 让对象实现
INotifyPropertyChanged
。 - 在影响
DisplayText
值的所有属性的 setter 中,使用DisplayText
作为属性名称引发NotifyPropertyChanged
事件。
然后你就可以开始了。
关于C# ListBox 更新项目更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5293539/