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

    Edit:
    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...


  • Administrator

    Gib als Owner Type DependencyBase<T> an. Ich vermute mal, dass es dann funktionieren wird. Der Grund dafür ist, dass die statischen Methoden nunmal DependencyBase<T> gehören und nicht Saveable . Daher können deine Methoden auch nicht gefunden werden. Siehe dazu auch:
    http://ideone.com/YQDJoV

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


  • Administrator

    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.


Log in to reply