"Bidirektionales" DataBinding zwischen Object Property und Textbox ?

31/05/2009 - 13:39 von Christian Treffler | Report spam
Hallo,

ich arbeite unter VS 2005 / .Net 2.0. Im Augenblick versuche ich, ein
Data Binding zwischen einem Textbox Inhalt (tbx_Number.Text) und einem
String Property (TheCQI.Number) einer Klasse herzustellen.
Dabei soll eine Benutzer-Eingabe in der Text Box in die
Klassen-Eigenschaft übernommen werden. Sollte sich im Programm-Ablauf
die Eigenschaft TheCQI.Number àndern, dann sollte der neue Inhalt auch
in der Textbox erscheinen.

Bis jetzt funktioniert das ganze nur in der Richtung
tbx_Number.Text => TheCQI.Number

Hier ist ein Auszug:

| private void Form1_Load(object sender, EventArgs e)
| {
| TheCQI = new MCQI();
| Binding bnd = new Binding("Text", TheCQI, "Number");
| bnd.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
| tbx_Number.DataBindings.Add(bnd);
| }

Mit diesem Code werden Eingaben in der Textbox sofort übernommen, aber
die andere Richtung funktioniert nicht.

Gibt es überhaupt eine Möglichkeit, ein "Bidirektionales" Data Binding
herzustellen?
Oder muss ich beim Ändern der Eigenschaft TheCQI.Number ein Kommando
geben, damit die Textbox aktualisiert wird?

TIA,
Christian
 

Lesen sie die antworten

#1 Frank Dzaebel
31/05/2009 - 14:51 | Warnen spam
Hallo Christian,

Gibt es überhaupt eine Möglichkeit, ein "Bidirektionales"
Data Binding herzustellen?



Du kannst über OnPropertyChanged gehen, dann
sollte die Klasse aber auch INotifyPropertyChanged
implementieren. Hier auch Hintergründe:

[Auf Datenbindung bezogene Schnittstellen]
http://msdn.microsoft.com/de-de/lib...17s4b.aspx

Dein Ansinnen làsst sich zum Beispiel so lösen:

TextBox tb = new TextBox();
Button btn = new Button();
Label lblInfo = new Label(); // <= nur zur Nachvollziehbarkeit
BindingList<Anschrift> personen = new BindingList<Anschrift>();
BindingSource bs = new BindingSource();

private void Form1_Load(object sender, EventArgs e)
{
btn.Text = "Setzen der Property über Code";
btn.Top = 20; btn.Width = 200; lblInfo.AutoSize = true;
Controls.Add(tb); Controls.Add(btn);
Controls.Add(lblInfo); lblInfo.Top = 60;
btn.Click += new EventHandler(btn_Click);
personen.Add(new Anschrift("Strassenname"));
bs.DataSource = personen;
tb.DataBindings.Add("Text", bs, "Strasse",true,
DataSourceUpdateMode.OnPropertyChanged);

// nur zur Nachvollziehbarkeit ...
bs.CurrencyManager.ItemChanged += new
ItemChangedEventHandler(CurrencyManager_ItemChanged);
}

// nur zur Nachvollziehbarkeit ...
void CurrencyManager_ItemChanged(object sender, ItemChangedEventArgs e)
{
lblInfo.Text = "interne Property: " + personen[0].Strasse;
}

void btn_Click(object sender, EventArgs e)
{
personen[0].Strasse = DateTime.Now.Second.ToString();
}

class Anschrift : INotifyPropertyChanged
{
public Anschrift(string strasse)
{
this.strasse = strasse;
}

private string strasse;
public string Strasse
{
get { return strasse; }
set
{
strasse = value;
NotifyPropertyChanged("Strasse");
}
}

public override string ToString()
{
return strasse;
}

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen