2016-05-02 8 views
1

ich eine benutzerdefinierte Steuerelement, das eine Value Eigenschaft hat, dass Zwei-Wege-Bindung und auch eine ValueChanged Veranstaltung unterstützt:Binding nicht zu Value Ereignis abonniert

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); 
} 

Diese Steuerung funktioniert gut, wenn auf einem Formular und die Daten platziert Bindungen im Designer festgelegt. Die Bindungsquelle abonniert das Ereignis korrekt und die zugrunde liegende Datenquelle wird entsprechend aktualisiert.

Nun Ich schaffe die Steuerung dynamisch durch folgende Maßnahmen:

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

jedoch durch diese Weise die Binding subscribe nicht dem ValueChanged Ereignis. Ich überprüfte den Code, der vom Designer generiert wurde, und es ist nicht so, dass sich die Bindingsource für das Ereignis registriert. Ich nehme an, dass das Hinzufügen der Bindung zu den Datenbindungen dies tun sollte, aber es tut dies nicht.

Was könnte hier fehlen?

Antwort

0

Alles ist in Ordnung.

Die Datenbindung erfolgt erst später - im Grunde, wenn das Steuerelement erstellt und zum ersten Mal sichtbar gemacht wird. Übrigens ist es die Datenbindungsinfrastruktur, die die Quell-/Zielereignisse abonniert. In dieser Hinsicht ist die bindende Quelle - wie jede andere Datenquelle auch.

Beachten Sie, dass die Datenbindung nicht initialisiert wird und nicht funktioniert, wenn Sie die Kontrolle nie wirklich sichtbar machen - zum Beispiel auf einer inaktiven Registerkarte. Ich denke, das sollte eine Art von Optimierung sein, die Probleme verursachen kann, wenn Sie es nicht wissen (und es sogar wissen).

Wie auch immer, wenn Sie sicher sein wollen, dass Ihre ValueChanged Ereignis verdrahtet ist, können Sie den Code wie folgt ändern:

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); 
} 

und einen Haltepunkt an der Veranstaltung add Methode setzen.

+0

Vielen Dank für dieses Snippet. Jetzt kann ich verfolgen, ob eine Bindung stattfindet, und verstehe, warum der Wert in der Datenquelle nicht festgelegt ist. –