我有一个包含两个ComboBoxes
的表单,每个表单绑定到BindingSource
。方框A的bindingSource的BindingList<MyObject>
为DataSource
,方框B为BindingList<string>
。
两个ComboBox的SelectedItem
属性绑定到视图模型上的属性(让他们称之为MyObject PropA和字符串PropB),实现INotifyPropertyChanged
。
我目前有两个问题:
填充ComboBox时,对视图模型的绑定不会更新,并且属性保持为空,直到我更改ComboBox中的选择。如果用户没有更改选择,我希望立即更新视图模型。这是不可能的,也许是通过重写ComboBox?
如果我在ComboBox B(字符串)中允许用户输入,在框中选择一个项目,然后编辑它并单击另一个控件,视图模型上的属性将变为null,并且ComboBox中的文本将更改回来。当在相同的选定项目上再次执行此操作时,编辑的文本将保留,但属性仍为null。如果我只选择一个没有编辑的项目,绑定似乎工作正常。
ComboBox控件在双向绑定方面是否有问题,或者我只是错误地使用它们?
感谢您的反馈!
修改
ComboBox A(productTypesComboBox):
// productTypesBindingSource
//
this.productTypesBindingSource.AllowNew = false;
this.productTypesBindingSource.DataMember = "ProductTypes";
this.productTypesBindingSource.DataSource = this.productDirectoryPresModelBindingSource;
//
// productTypesComboBox
//
this.productTypesComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this.productBindingSource, "ProductType", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.productTypesComboBox.DataSource = this.productTypesBindingSource;
this.productTypesComboBox.DisplayMember = "Name";
ComboBox B(unitsComboBox):
// unitsBindingSource
//
this.unitsBindingSource.DataMember = "Units";
this.unitsBindingSource.DataSource = this.productDirectoryPresModelBindingSource;
//
// unitsComboBox
//
this.unitsComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this.productBindingSource, "Unit", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.unitsComboBox.DataSource = this.unitsBindingSource;
视图模型:
//
// productBindingSource
//
this.productBindingSource.DataSource = typeof(SiMA.ViewModels.ProductVM);
观点背后:
private void BindToPresentationModel()
{
presentationModel = new ProductDirectoryPresModel();
presentationModel.ItemsBindingSource = productBindingSource;
演示模型(单击某个按钮时)
public virtual void AddNewItem()
{
if (!currentItemIsSaved)
{
DialogResult result = ShowSaveChangesDialog();
if (result == DialogResult.Yes)
{
SaveCurrentItem();
ItemsBindingSource.AddNew();
}
...