3 Stimmen

Gebundenes UserControl aktualisiert die Datenquelle nicht

Ich habe ein UserControl, das ein Textfeld, eine Schaltfläche und ein Tooltip-Steuerelemente auf es hat. Es implementiert INotifyPropertyChanged Ich habe versucht, die Text Eigenschaft und das Hinzufügen meiner eigenen Eigenschaft, aber in allen Fällen liest das Steuerelement aus der gebundenen Datenquelle gut, aber nie aktualisiert die Datenquelle. Meine Ereignisse werden ausgelöst, wenn der Text geändert wird. Einige der Code ist unten. Alle anderen Standardsteuerelemente funktionieren einwandfrei. Was muss ich tun, damit das Steuerelement die Datenquelle aktualisiert, wenn der Benutzer den Wert eingegeben oder geändert hat?

public partial class UrlControl : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [Bindable(true)]
    [Browsable(true)]
    public string Url
    {
        get
        {
            return url.Text;
        }
        set
        {
            if (value != url.Text)
            {
                url.Text = value;
                OnPropertyChanged("Url");
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

Dies ist der Bindungscode aus dem Formular-Designer.

this.urlControl1.DataBindings.Add(new System.Windows.Forms.Binding("Url", this.customerBindingSource, "First", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

}

5voto

Igby Largeman Punkte 16135

INotifyPropertyChanged ist für Datenquellen. Sie ermöglicht es Ihrer Datenquelle, gebundene Steuerelemente und andere Listener über Eigenschaftsänderungen zu informieren. Die Steuerelemente selbst verwenden jedoch einen anderen Mechanismus. Es ist ein wenig seltsam: Sie erstellen Ereignisse für Ihr Steuerelement mit der Namenskonvention <PropertyName>Changed . Wenn sich der Wert einer Eigenschaft ändert, lösen Sie das zugehörige Ereignis aus.

Beispiel:

public string Url
{
    get { return url.Text; }
    set 
    { 
        if (value != url.Text) 
        { 
            url.Text = value; 
            OnUrlChanged(); // raise event
        }
    }
}

public event EventHandler UrlChanged;

private void OnUrlChanged()
{
    // raise the UrlChanged event
    if (UrlChanged != null)
        UrlChanged(this, new EventArgs());
}

Das ist alles, was Sie tun müssen. Die Datenbindungsfeen sehen dieses Ereignis und verknüpfen es, wenn Sie die Bindung erstellen.

Hier ist das Thema auf MSDN: Wie geht das? Anwenden des PropertyNameChanged-Musters

1voto

Reddog Punkte 14469

Dies sollte für das Lesen von Werten aus der Datenquelle gut funktionieren.

Wenn es jedoch darum geht, Werte in die Datenquelle zu schreiben, sieht es so aus, als ob Sie die Werte speichern und abrufen würden. Url Wert direkt aus der url Textfeld. Sie lösen jedoch keine Benachrichtigungen über Eigenschaftsänderungen aus, wenn der Text des Textfelds innerhalb der Benutzeroberfläche geändert wird. Um dies zu beheben, fügen Sie einen TextChanged-Ereignishandler für das Textfeld hinzu, der einfach aufgerufen werden kann:

void url_TextChanged(object sender, EventArgs e)
{
    OnPropertyChanged("Url");
    OnUrlChanged(); // See additional note below
}

Nebenbei bemerkt, obwohl die Umsetzung INotifyPropertyChanged sollte Arbeit... Wenn es um die Windows Forms-Bindung geht, können Sie auch ein Ereignis mit dem Eigenschaftsnamen mit dem Zusatz "Changed" erstellen und die Bindung sollte das beobachten:

public event EventHandler UrlChanged;

protected virtual void OnUrlChanged()
{
    var handler = UrlChanged;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

[Bindable(true)]
[Browsable(true)]
public string Url
{
    get
    {
        return url.Text;
    }
    set
    {
        if (value != url.Text)
        {
            url.Text = value;
            OnPropertyChanged("Url");
            OnUrlChanged();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X