2016-05-02 24 views
1

に加入していない私は、双方向バインディングともValueChangedイベントサポートValueプロパティを持つカスタムコントロールを持っている:がのBindingSource ValueChangedイベント

public event EventHandler ValueChanged; 

[Bindable(BindableSupport.Yes, BindingDirection.TwoWay)] 
public virtual MyObject Value 
{ 
    get { return this.value; } 
    set 
    { 
     this.value = value; 
     OnValueChanged(new EventArgs()); 
    } 
} 

private void OnValueChanged(EventArgs e) 
{ 
    EventHandler handler = ValueChanged; 
    if (handler != null) 
     handler(this, e); 
} 

フォームとデータの上に置かれたときに、このコントロールは正常に動作しますデザイナーで設定されたバインディングです。バインディングソースはイベントに正しくサブスクライブし、それに応じて基礎となるデータソースが更新されます。

さて、私は次の操作を実行して、動的にコントロールを作成しています:

MyControl ctl = new MyControl(); 
ctl.DataBindings.Add(new Binding("Value", this.bindingSource, "SomeField", true, DataSourceUpdateMode.OnPropertyChanged)); 

ただし、これを行うことによって、のBindingSourceはValueChangedイベントに加入していません。私はデザイナーによって生成されたコードをチェックしましたが、バインディングソースをイベントに登録させるコードはありません。私は、データバインディングにバインディングを追加すると、これを行う必要がありますが、それはしないと仮定します。

ここでは何が間違っていますか?

答えて

0

すべては問題ありません。

データバインディングは後で発生します。基本的に、コントロールが作成され、最初に表示されるときです。 Btwは、ソース/ターゲットイベントをサブスクライブするデータバインディングインフラストラクチャです。その点で、他のデータソースと同様に、バインディングソースは - 井戸です。

コントロールが本当に表示されない場合(たとえば、非アクティブなタブページにある場合など)、データバインディングは初期化されず、機能しません。私はあなたがそれを知らない(そしてそれを知っていても)問題を引き起こす可能性のある何らかの最適化であると考えています。

あなたのValueChangedイベントが有線であることを確認したい場合はとにかく、あなたはこのようなコードに変更することができます

EventHandler valueChanged; 
public event EventHandler ValueChanged 
{ 
    add { valueChanged += value; } 
    remove { valueChanged -= value; } 
} 

private void OnValueChanged(EventArgs e) 
{ 
    EventHandler handler = valueChanged; 
    if (handler != null) 
     handler(this, e); 
} 

をし、イベントadd方法でブレークポイントを置きます。

+0

このスニペットありがとうございます。バインディングが発生しているかどうかを確認し、データソースに値が設定されていない理由を理解できます。 –

関連する問題