【发布时间】:2019-04-18 07:18:17
【问题描述】:
我的设置
我有以下(伪)EF 类:
class Department {
int ID,
string Name
}
class DepartmentCustomer {
int ID,
int CustomerID,
Customer Customer,
string Information,
int DepartmentID,
Department Department
}
Class Customer {
int ID,
string Name,
int? CityID,
City City
}
Class City{
int ID,
string Name,
string PostalCode
}
我有一个带有 List(of DepartmentCustomer) 的 BindingSource 和以下字段的表单:
-
DepartmentCustomer.Information作为(读写)文本框 -
DepartmentCustomer.Customer.Name作为(只读)文本框 -
DepartmentCustomer.Customer.City作为(读写)组合框。
城市名称的组合框具有以下属性:
ComboBoxCity.DataSource = ListOfCities ' = List(Of City)
ComboBoxCity.ValueMember = "Id"
ComboBoxCity.DisplayMember = "Name"
ComboBoxCity.DataBindings.Add(New Binding("SelectedItem", DepartmentCustomerBindingSource, "Customer.City", True, DataSourceUpdateMode.OnPropertyChanged))
我的问题
当DepartmentCustomerBindingSource.CurrentItemChanged出现时,Combobox不同步;它有时会更新为正确的值,但是当进一步浏览 BindingSource 时,它会保持上一个项目被选中
所以,我必须手动更新组合框
Private Sub DepartmentCustomerBindingSource_CurrentItemChanged(sender As Object, e As EventArgs) Handles DepartmentCustomerBindingSource.CurrentItemChanged
If DepartmentCustomerBindingSource.Current.Contact.City Is Nothing then
ComboBoxCity.SelectedIndex = -1
Else
ComboBoxCity.SelectedItem = DepartmentCustomerBindingSource.Current.Contact.City
End if
End Sub
(为了简单起见,我在上面的代码中省略了强制转换。此外,这些示例类可能没有意义 IRL)
编辑
即使上面的代码也不能满足我的要求。 例如:我有两个 DepartmentCustomer 实例,一个带有 Contact.City,第二个没有 Contact.City。当表单第一次打开时,它会显示城市;当我导航到第二条记录时,组合框变为空,但是当我回到第一个组合框时,它保持为空;更令人惊讶的是,第一条记录已经更新为 Contact.City = Nothing :'(
编辑 2:我自己不喜欢的解决方案
我已从组合框 (ComboBoxCity.DataBindings.Add(New Binding("SelectedItem", DepartmentCustomerBindingSource, "Customer.City", True, DataSourceUpdateMode.OnPropertyChanged))) 中删除了数据绑定并添加了以下子项
Private Sub ComboBoxCity_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBoxCity.SelectedValueChanged
DepartmentCustomerBindingSource.Current.Contact.City = ComboBoxCity.SelectedItem
End Sub
这行得通,但是由于我的表单中有很多这样的组合框,我认为必须有一种“自动”的方式来同步双向绑定的组合框...
编辑 3:我认输
即使我上面的“解决方案”也没有按预期工作;使用上述代码时,实例的 Contact.City 未正确更新...
我的问题
为什么我必须手动执行此操作;我错过了什么吗?我认为通过设置 DataBinding,只要导航绑定的 BindingSource,它就会更新 SelectedItem;
【问题讨论】:
-
大多数情况下,控件不更新是与接口 INotifyPropertyChanged 和 IBindingList 未(正确)实现相关的问题。
-
@MarcoGuignard 谢谢!!!请参阅下面的答案(以及我的附加问题)
标签: vb.net winforms entity-framework-6