Entwickler-Ecke

Sonstiges (.NET) - DataBinding nicht Bidirektional?


Christoph1972 - Mi 08.09.10 16:28
Titel: DataBinding nicht Bidirektional?
Hallo Leute,

wenn ich eine TextBox an ein Property einer Klasse binde und nun die Eigenschaft verändere, wird der neue Wert gleich in der TextBox dargestellt. In die andere Richtung funktioniert das jedoch nicht. Wenn der Text, der gebundenen TextBox verändert wird, wird zwar das PropertyChangedEvent ausgelöst, der Wert wird aber nicht übernommen. Ein Haltepunkt im Seter zeigt mir den Wert der TB an, dieser ist jedoch in der Instanz nicht vorhanden.

So sieht meine Datenbindung aus:

C#-Quelltext
1:
textbox.DataBindings.Add("Text", MyConnectionData, "Server"false, DataSourceUpdateMode.OnValidation);                    

Habe ich etwas falsch verstanden bzw. falsch gemacht?? Oder ist das bewusst so gelöst, um eine Rekursion zu verhindern?

Könnte mir mal wer auf die Sprünge helfen?


Ralf Jansen - Mi 08.09.10 16:34

Wenn der Wert im Setter ankommt aber dann nicht übernommen wird ist wohl was im Setter faul. Zeig doch mal.


Christoph1972 - Mi 08.09.10 16:39


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
[Serializable]
public class ServerConnectionData : INotifyPropertyChanged
{
    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    private string _User;       
    public string User
    {
        get { return _User; }
        set
        {
            _User = value; FirePropertyChanged("User"); 
        }
    }

    private string _PW;

    public string PW
    {
        get { return _PW; }
        set
        {
            _PW = value; FirePropertyChanged("PW");
        }
    }

    private string _Server;

    public string Server
    {
        get { return _Server; }
        set
        {
            _Server = value; FirePropertyChanged("Server"); 
        }
    }

    private string _Service;

    public string Service
    {
        get { return _Service; }
        set
        {
            _Service = value; FirePropertyChanged("Service"); 
        }
    }

    private string _Port;

    public string Port
    {
        get { return _Port; }
        set
        {
            _Port = value;FirePropertyChanged("Port");
        }
    }
    

    private void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(thisnew PropertyChangedEventArgs(propertyName));
    }
}


Christoph1972 - Do 09.09.10 21:19

So wie es aussieht muss ich wohl selbst für das Update sorgen, über das PropertyChangedEvent. Eigentlich hatte ich mich für DataBinding entschieden, um weniger Code schreiben zu müssen, jetzt habe ich noch zusätzlichen für das Binden der Controls. Na ja, ich denke für mein Anliegen ist DataBinding etwas Over Size. Bei Gelegenheit findet sich sicher eine bessere Möglichkeit.


Ralf Jansen - Do 09.09.10 23:26

Du bindest eine Textbox an eine simple Property einer simplen Klasse das muss funktionieren!

Irgendein simpler Fehler wird schon dahinter stecken. Klassiker wäre z.b. du hast an der MyConnectionData Variablen eine neue ServerConnectionData Klasse erzeugst nachdem du das Binding angelegt hast und das Binding nicht erneuerst. Dann schaut das Control noch auf die alte Klasse und ändert die während du nur auf deine neue Klasse schaust ;)


Edit: Wenn du das machst um Code zu sparen wieso machst du das Binding von Hand und nicht über den visuellen Editor?


Christoph1972 - Fr 10.09.10 20:03

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
eine neue ServerConnectionData Klasse erzeugst nachdem du das Binding angelegt hast und das Binding nicht erneuerst.


Genau das wars, man wie blöd......

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

Edit: Wenn du das machst um Code zu sparen wieso machst du das Binding von Hand und nicht über den visuellen Editor?


Ich möchte mal Programmierer werden, da sollte man doch wissen wie das geht, die nötige Portion Faulheit gehört trotzdem dazu.


Vielen Dank für die Hilfestellung!


Ralf Jansen - Fr 10.09.10 20:46

Zitat:
Ich möchte mal Programmierer werden, da sollte man doch wissen wie das geht


Es verstehen zu wollen ist lobenswert. Wenn man es verstanden hat dann weiterhin selbst im Code zu machen nicht hilfreich (es ensteht kein ~besserer~ Code) ;)