3

私はこれを理解できないようで、答えを見つけることができませんでした。

モデルのプロパティにバインドされた 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"));
            }
        }
    }

コンボボックスの 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 インターフェイスを実装していない場合、データへの変更は、各変更の直後に基になるデータ ソースにコピーされます。

したがって、私の理解では、コンボボックスの値を変更するとすぐにモデルを更新する必要があります。

通常の WinForms コンボボックスとほぼ同じ DevExpress コンボボックスを使用しています。

どうすればこれを回避できますか?

4

2 に答える 2

0

BindingSource.EndEditで何かを行うには、BindingSourceに含まれるアイテムにSystem.ComponentModel.IEditableObjectを実装する必要があります。

バインディングソースで「EndEdit」を呼び出すと、その後、IEditableObjectを実装するリスト内のアイテムで対応するIEditableObject.EndEdit()メソッドが呼び出されます。

そうは言っても、たとえばユーザーがフォームを閉じたときに、BeginEditが呼び出されたすべてのアイテムに対してEndEditが呼び出されないという問題があります。

于 2013-02-05T02:27:25.847 に答える
0

「EditValue」ではなく「Value」プロパティにバインドしてみてください。お役に立てば幸いです。

于 2012-12-18T15:22:12.880 に答える