2010-07-19 11 views
11

Gibt es eine Möglichkeit, einer angefügten Abhängigkeitseigenschaft eine Einschränkung hinzuzufügen, sodass sie nur auf einen bestimmten Typ in den Metadaten angewendet werden kann?Einschränkung, um den Gültigkeitsbereich einer angefügten Abhängigkeitseigenschaft zu begrenzen

Wenn nicht, ist es sinnvoll, die statischen Get-und Set-Methoden der angeschlossenen DPs explizit einzugeben?

Beispiel:

Wenn ich zum Beispiel die folgende Erklärung ab:

public static int GetAttachedInt(DependencyObject obj) { 
    return (int)obj.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(DependencyObject obj, int value) { 
    obj.SetValue(AttachedIntProperty, value); 
} 

public static readonly DependencyProperty AttachedIntProperty = 
    DependencyProperty.RegisterAttached("AttachedInt", typeof(int), 
    typeof(Ownerclass), new UIPropertyMetadata(0)); 

wäre es meaningfull sei es wie folgt zu ändern, nur um es zu Textfelder anwenden?

public static int GetAttachedInt(TextBox textBox) { 
    return (int)textBox.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(TextBox textBox, int value) { 
    textBox.SetValue(AttachedIntProperty, value); 
} 

public static readonly DependencyProperty AttachedIntProperty = 
    DependencyProperty.RegisterAttached("AttachedInt", typeof(int), 
    typeof(Ownerclass), new UIPropertyMetadata(0)); 

Meine Frage ist, da dies zu einer Inkonsistenz führt, weil GetValue und SetValue mehr für jede Art verwendet werden könnten, und auch im Markup ist keine Möglichkeit, die Befestigung zu begrenzen.

Was ich früher getan habe, war, dass ich eine Ausnahme in den PropertyChanged-Handler hinzugefügt und dort eine Ausnahme ausgelöst, dass nur die Typen xy erlaubt sind.

Was denkst du?

+0

Gute Frage ... hoffentlich löst meine neue Antwort es. – Noldorin

+2

Für die Metadaten habe ich mir eine andere Antwort gewünscht, aber ich habe auch nichts gesehen. Für die Deklaration der Zugriffsmethoden halte ich das für eine Frage der Politik. Wenn es vernünftig ist, es so zu machen, werde ich es tun. Aber für mich ist es ein wenig wie schließen Sie den Balkon mit einem großen Schloss, aber lassen Sie die Haupttür entriegelt. Aber zumindest zeigen die set-and-get-Methoden den Zweck des angehängten dp. Ich werde Ihre Empfehlung verwenden, aber weiterhin den Zieltyp im PropertyChanged-Handler überprüfen. So wird ein Benutzer eine Ausnahme im Designer erhalten, wenn er versucht, die DP auf einem falschen Steuerelement zu verwenden. – HCL

Antwort

15

Ich glaube, Sie müssen nur die Definitionen der Methoden GetPropertyName und SetPropertyName ändern, um den Zieltyp der angefügten Eigenschaften zu beschränken.

Beispiel:

public static int GetAttachedInt(MyTargetType obj) 
{ 
    return (int)obj.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(MyTargetType obj, int value) 
{ 
    obj.SetValue(AttachedIntProperty, value); 
} 

wo jeder Typ von MyTargetTypeDependencyObject Vererbungs sein kann.

+2

Nun, nicht so falsch ... Ich habe versucht mit Visual Studio 2013 und es gibt den folgenden Fehler, wenn Sie versuchen, die Eigenschaft an etwas anderes anzuhängen: ** Die angefügte Eigenschaft "AttachedInt" kann nur auf Typen angewendet werden, die abgeleitet sind "TextBox". ** –

+0

Benoit hat Recht. In VS2013 verhindert XAML intellisense das Anhängen an ein nicht unterstütztes Element. Ich benutze ReSharper nicht. –

Verwandte Themen