Laden...

UserControl mit DependencyProperty mehrfach verwenden

Erstellt von trib vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.245 Views
T
trib Themenstarter:in
708 Beiträge seit 2008
vor 10 Jahren
UserControl mit DependencyProperty mehrfach verwenden

Guten Tag zusammen,

vor einiger Zeit habe ich mich an WPF gewagt und nach einige anfänglichen Schwierigkeiten, läuft es auch ganz gut. Bis jetzt 😁
Es ist eine Sache Controls mit DataBinding zu verwenden und eine andere, diese selbst zu erstellen.

Ziel:
Mein UserControl soll einen Button mit OpenFileDialog darstellen. Dieser soll anzeigen ob die Datei vorhanden ist und/oder sich öffnen lässt.

Step 1:
Die Umsetzung des Buttons mit interaktiver Border-Farbe und OpenFile-Dialog war natürlich kein Problem.

Step 2:
String-Property erstellen und im Setter prüfen ob die Datei existiert. => Funktioniert natürlich nicht, da keine INotify-Funktionalitäte o.ä. implementiert wurde

Step 3:
Nach etwas Recherche dann DependencyProperty implementiert, um die Änderung an dem Wert mitzubekommen.

public string Text
        {
            get
            {
                return (string)GetValue(TextProperty);
            }
            set { SetValue(TextProperty, value);
                CheckFileExists();
            }
        }

        public static readonly DependencyProperty TextProperty =
          DependencyProperty.Register("Text", typeof(string), typeof(BrowserDialog), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, TextValueChanged));

private static void TextValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
      var sender = o as BrowserDialog;
        if (e.NewValue != null)
            sender.Text = e.NewValue.ToString();
    }

Das erscheint mich zwar nicht sonderlich elegant, aber ich habe es so in etlichen Tutorials gesehen und übernommen.
Beispiel Tut 1
Beispiel Tut 2

Funktioniert!
Nun ändert sich die Farbe unmittelbar bei Änderung des Dateipfades. Auch die Rückgabe nach dem Datei-Dialog funktioniert.

Problem:
Füge ich nun noch ein UserControl von meinem Typ ein, so kommt die Meldung:

Fehler	1	"Text"-Eigenschaft wurde bereits von "BrowserDialog" registriert.	

Das ist natürlich klar, aufgrund der static Variablen & des Events . Aber wie löse ich es sonst?

Es kann doch eigentlich nicht so kompliziert sein, ein DataBinding zu implementieren und dynamisch auf dessen Änderungen zu reagieren.
So langsam habe ich das Gefühl, ich bin vollkommen auf dem Holzweg und verrenne mich da in den DependencyProperties und es gibt etwas viel einfacheres X(

Für jeden Schubs in die richtige Richtung wäre ich sehr dankbar!

[EDIT] ein static vergessen

5.657 Beiträge seit 2006
vor 10 Jahren

Hi trib,

ein DependencyProperty sollte als static deklariert sein.

Füge ich nun noch ein UserControl von meinem Typ ein, so kommt die Meldung:

Fehler	1	"Text"-Eigenschaft wurde bereits von "BrowserDialog" registriert.	  
  

Das ist natürlich klar, aufgrund der static Variablen & des Events . Aber wie löse ich es sonst?

Das kann ich allerdings nicht nachvollziehen. Wo ist das Text-Property schonmal deklariert worden? Kann aber evtl. sein, daß sich das Problem schon dadurch beheben läßt, daß du das DependencyProperty als statisch deklarierst...

Christian

Weeks of programming can save you hours of planning

T
trib Themenstarter:in
708 Beiträge seit 2008
vor 10 Jahren

Hallo Christian,

vielen dank für die schnelle Antwort!
Aus den Tutorials hatte ich natürlich das static übernommen. Aber aufgrund des o.g. Fehlers testweise mal herausgenommen. Daher auch das [EDIT].
Kaum wieder einprogrammiert und es funktioniert alles wie gewünscht!
Vielen Dank! Da habe ich vor lauter Testen und probieren den Wald vor lauter Bäumen nicht gesehen 😃

Gruß,
trib