WPF Attached Dependency Property Base Class
-
Guten Morgen Community,
zur Zeit versuche ich eine Basisklasse für Attached Dependency Properties zu erstellen. Das sieht zur Zeit so aus:
public abstract class DependencyBase<T> { public static DependencyProperty TheValueProperty = DependencyProperty.RegisterAttached("TheValue", typeof(string), typeof(T)); public static string GetTheValue(DependencyObject obj) { return obj.GetValue(TheValueProperty) as string; } public static void SetTheValue(DependencyObject obj, string value) { obj.SetValue(TheValueProperty, value); } }
Da attached properties statisch sein müssen, ich aber für jede Unterklasse ein eigenes Property möchte, ist die Basisklasse generisch. Die Unterklasse sieht so aus:
public class Saveable : DependencyBase<Saveable> { //... }
Durch den Debugger konnte ich schon entdecken, das ein Property mit dem Owner "Saveable" in der Saveable Klasse initialisiert wird.
In meinem XAML Code habe ich folgendes stehen:
<TextBox Name="textBox1" local:Saveable.TheValue="{Binding ElementName=textBox1, Path=Text}"/>
Wenn ich das ausführe, bekomme ich eine XamlParseException:
"Binding" kann nicht für die Eigenschaft "SetTheValue" vom Typ "TextBox" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden.
Entferne ich "DependencyBase" als Basisklasse und implementiere die Attached Properties direkt in "Saveable", funktioniert es.
Vielleicht weiß jemand Rat.
Mit freundlichen Grüßen,
FreakyEdit:
Es liegt wohl daran, dass die statischen Methoden nicht richtig geerbt werden. Wenn ich nur die statischen Methoden (das Property kann ich weglassen) in die Unterklasse einsetze, funktioniert es. Mein Attached Property im XAML Code kann also den Pfad der Methode nicht richtig auflösen. Das es an dem static liegt, habe ich mir schon ungefähr gedacht. Weiß jemand ein workaround?
-
Ich bin zwar noch relativ grün in WPF...
Aber wäre bei statischen Methoden die Implementierung über delegates nicht besser?
http://msdn.microsoft.com/de-de/library/ms173171.aspx
delegates gehen auch generisch und dann nicht mit der DependancyBase rumfummeln.Hast im XAML wirklich eine Instanz der abstrakten Klasse gebildet?! -Just checking. Nur Überlegungen...
-
Gib als Owner Type
DependencyBase<T>
an. Ich vermute mal, dass es dann funktionieren wird. Der Grund dafür ist, dass die statischen Methoden nunmalDependencyBase<T>
gehören und nichtSaveable
. Daher können deine Methoden auch nicht gefunden werden. Siehe dazu auch:
http://ideone.com/YQDJoVGrüssli
-
Deswegen ja Delegates. Dabei muss er sich um den Owner nicht mehr kümmern.
Perfekt für Prototyping und Machbarkeitsstudien mit geringen refactoring.
Einfach Design by Contract und SW Architektur und Methodendefinitionen kommen später.
Ganz wie die Jungs da unten:
http://www.c-plusplus.net/forum/f66
-
Hast du überhaupt nur einen blassen Schimmer davon was Attached Properties sind und diese machen?
Grüssli
-
@Prof84
Attached Dependency Properties
Da kann man leider nichts eben mal durch delegates ersetzen, aber danke für deine Hilfe.@Dravere
Danke für deine Antwort, das hat mein Problem gelöst.