将ComboBox绑定到WinForms中的ViewModel

时间:2015-06-09 19:20:27

标签: c# winforms data-binding

我有一个包含两个ComboBoxes的表单,每个表单绑定到BindingSource。方框A的bindingSource的BindingList<MyObject>DataSource,方框B为BindingList<string>

两个ComboBox的SelectedItem属性绑定到视图模型上的属性(让他们称之为MyObject PropA和字符串PropB),实现INotifyPropertyChanged

我目前有两个问题:

  1. 填充ComboBox时,对视图模型的绑定不会更新,并且属性保持为空,直到我更改ComboBox中的选择。如果用户没有更改选择,我希望立即更新视图模型。这是不可能的,也许是通过重写ComboBox?

  2. 如果我在ComboBox B(字符串)中允许用户输入,在框中选择一个项目,然后编辑它并单击另一个控件,视图模型上的属性将变为null,并且ComboBox中的文本将更改回来。当在相同的选定项目上再次执行此操作时,编辑的文本将保留,但属性仍为null。如果我只选择一个没有编辑的项目,绑定似乎工作正常。

  3. 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();
            }
        ...
    

0 个答案:

没有答案