Laden...

DependendcyObject.SetValue() löst Bindung auf (?)

Erstellt von DiscMaster vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.226 Views
DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 14 Jahren
DependendcyObject.SetValue() löst Bindung auf (?)

Hallo zusammen,

wieder eins meiner Probleme die scheinbar noch nie diskutiert wurden...

Ich habe ein UserControl (Datei-Browser) bestehend aus einer TextBox die einen Datei- oder Ordnerpfad gekürzt ausgibt, und einen Button, der einen FileDialog öffnet. Ich habe dem Control ein Wrapper-Property verpasst, das da heißt SelectedPath. Das hält den absoluten Pfad zu der gekürzten Fassung aus der TextBox. Dem liegt ein DependendcyProperty zugrunde. Jetzt habe ich das alles so konstruiert, das wenn man in die TextBox klickt, der gekürzte Pfad durch den echten erstetzt wird, verliert sie dann den Focus wieder, wird der (neu eingegebene) Pfad wieder gekürzt. Das Control funktioniert bis hierhin einwandfrei.

Jetzt verwende ich das Control und Binde die SelectedPath-Eigenschaft an das SelectedItem einer ComboBox. Wenn ich die Auswahl in der ComboBox ändere, steht auch der richtige Pfad im Datei-Browser. Bekommt die TextBox allerdings den Focus und verliert ihn anschließend wieder, wird der FocusLost-Event gefeuert, und folgender Handler abgearbeitet:


      string tmp = txtPath.Text;
      if (mode == BrowseMode.Directory && Directory.Exists(tmp)) {
        tmpPath = tmp;
        dlgDirectory.SelectedPath = tmp;
      }
      else if (mode == BrowseMode.File && File.Exists(tmp)) {
        tmpPath = tmp;
        dlgFile.FileName = tmp;
      }
      SelectedPath = tmpPath;

(Die SelectedPath-Eigenschaft legt nur den Wert des DependendcyPropertys fest (SetValue(...)))
Ist dieses SetValue() ersteinmal aufgerufen worden (ich hab auch probiert es in obeingem Code zu machen, statt SelectedPath = ...), funktioniert die Datenbindung scheinbar nicht mehr, denn wenn ich jetzt die Auswahl in der ComboBox wieder ändere, dann passiert einfach ganix, der Text in der TextBox bleibt unverändert.

So, ich glaube das war ziemlich ausführlich und hoffe, das mir jemand weiter helfen kann.....

Gruß DiscMaster

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

6.862 Beiträge seit 2003
vor 14 Jahren

Hallo,

ist das zu erwartende Verhalten - ist auch so dokumentiert, siehe hier. Du ersetzt immerhin das Binding mit nem anderen Wert. Wieso sollte danach auf einmal wieder das Binding da sein?

Baka wa shinanakya naoranai.

Mein XING Profil.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 14 Jahren

nagut, sowas in der art dachte ich mir schon... jetzt ist nur die überlegung wie ich den Wert unter der Bindung verändern kann....? (Ich hoffe das habe ich bei dem Link jetzt nicht einfach übersehen)

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

5.742 Beiträge seit 2007
vor 14 Jahren

jetzt ist nur die überlegung wie ich den Wert unter der Bindung verändern kann....?

So wie ich das verstehe habe, soll das ab .NET 4.0 mithilfe von DependencyObject.SetCurrentValue gehen.

Aber im Normalfall ändert man einfach den Wert des gebundenen Objektes.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 14 Jahren

naja, das ist aber in meinem fall nicht ganz so sinnvoll weil ich an dieser stelle noch nicht weiß ob der wert hinterher auch übernommen werden soll.....

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

5.742 Beiträge seit 2007
vor 14 Jahren

Für so etwas eignet sich das MVVM-Pattern: Einfach eine Schicht dazwischenschieben, an die direkt gebunden werden kann.

Dann löst du auf einen Schlag sehr viele Probleme.