【发布时间】:2019-12-05 12:22:42
【问题描述】:
我目前正在尝试实现一个相对简单的数据管理应用程序。
我有一个班级Member 和一个BindingList<Member> membersList,还有一个ListBox和一些TextBoxes。
ListBox 绑定到membersList。
现在,理想情况下,我想将TextBoxes 绑定到ListBox.SelectedItem,以便用户在ListBox 中选择的任何元素,当他们编辑TextBox 时,membersList 中的元素都会更新.
我尝试将TextBoxes 绑定到ListBox.SelectedItem,但这使得Binding 成为ListBox.SelectedItem 在绑定创建时引用的实际元素,而不是@ 中选择的任何项目987654337@.
firstNameTextBox.DataBindings.Add(new Binding("Text",
membersList.SelectedItem, "firstName", false,
DataSourceUpdateMode.OnPropertyChanged));
我实际上已经通过在membersList_SelectedIndexChanged(object sender, EventArgs e) 事件处理程序中为TextBoxes 清除和重新创建Bindings 解决了这个问题,但这感觉非常“hacky”,我怀疑还有一个更标准的解决方案。
我的另一个想法是将Bindings 设置为Member temporaryMember,在membersList_SelectedIndexChanged(object sender, EventArgs e) 事件处理程序中设置为ListBox.SelectedItem,但随后我必须手动将更改写入相应的项目在membersList 这也让我觉得这不是最佳解决方案。
有没有办法让Binding 动态化,也就是说,在创建时,我向它表明DataSource 正在改变?
还是一种标准方式来更改Bindings 数据源而不删除它并创建一个新数据源? (或者这实际上是最佳实践?)
(要提的另一件事:我是 C# 中 Bindings 的新手,在搜索解决方案时,我发现显然有两个不同的类,一个在 System.Windows.Data 命名空间中,另一个在 System.Windows.Forms 命名空间中.我想我正在使用后者的类。也许我应该使用另一个?)
【问题讨论】:
-
我尝试将 TextBoxes 绑定到 ListBox.SelectedItem,但这使得绑定到 ListBox.SelectedItem 在绑定创建时引用的实际元素,而不是选择的任何项目在 ListBox 中。 这是什么意思?
ListBox中选中的项目是SelectedItem。 -
ListBox具有对双向数据绑定的内置支持。使用BindungList<T>作为 T 实现InotifyPropertyChanged的数据源。请查看this post 了解更多信息。 -
@RezaAghaei 是的,但是当
ListBox.SelectedItem发生变化时,Binding的DataSource没有变化。 -
你能验证绑定吗? membersList.SelectedItem, "firstName" 似乎绑定到源 membersList.SelectedItem 中的属性 firstName,它看起来不对...
-
正如 Reza Aghaei 所说,还将
BindingList设置为BindingSource的数据源。 TextBoxes 只需要一个Binding设置为BindingSource,当ListBox 中的某个项目被选中时,TextBoxes 会自动更新。此外,当BindingList的成员被更改/修改时。如果BindingList的某个项目发生更改,则 ListBox 不会更新当前的 ListItem,但如果发生这种情况,您只需调用[BindingSource].ResetCurrentItem();。