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
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
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