强制BindingSource更新数据/模型

时间:2012-12-18 15:17:17

标签: c# user-interface devexpress

我似乎无法解决这个问题,也找不到任何答案。

我有一个Combobox绑定到我的模型中的属性。 我只需在代码中复制并粘贴关键行:

       this.m_typeCombobox.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this.m_bindingSource, "Type", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

我的模特:

public class TypeConfig : INotifyPropertyChanged
{     
            public event PropertyChangedEventHandler PropertyChanged;
           private EnumType<eLType> m_type;
    public EnumType<eLType> Type
    {
        get { return m_type; }
        set
        {
            if (m_type!= value)
            {
                m_type= value;
                var handler = PropertyChanged;
                if (handler != null)
                    handler(this, new PropertyChangedEventArgs("Type"));
            }
        }
    }

我需要在combobox EditValueChanged事件上更新模型,但看起来模型稍后会更新。 EditValueChanged是更改时的最新被调用事件。

我试过这个:

void m_TypeCombobox_EditValueChanged(object sender, EventArgs e)
    {
           m_bindingSource.EndEdit(); //this doesn't work 
          //need to have the new value here
    }

以下是MSDN所说的内容:

调用EndEdit方法时,所有挂起的更改都将应用于基础数据源。 除非数据源包含的对象实现IEditableObject接口,否则此方法无效。如果对象未实现IEditableObject接口,则在每次更改后立即将对数据的更改复制到基础数据源。

因此,从我的不受欢迎的角度来看,在更改组合框值时应立即更新模型。

我使用的DevExpress组合框与普通的WinForms组合框几乎相同。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

尝试绑定“Value”属性,而不是“EditValue” 我希望它可以帮到你

答案 1 :(得分:0)

要使BindingSource.EndEdit执行任何操作,您需要为BindingSource中包含的项实现System.ComponentModel.IEditableObject。

当您在绑定源上调用“EndEdit”时,它随后会对其列表中实现IEditableObject的项调用相应的IEditableObject.EndEdit()方法。

话虽如此,我遇到的一些问题是EndEdit没有被调用,例如,当用户关闭表单时,所有调用了BeginEdit的项目。