2010-07-19 11 views
11

C'è un modo per aggiungere un vincolo a una proprietà di dipendenza collegata in modo che possa essere applicata solo a un tipo specifico, qualcosa nei metadati?Vincolo per limitare l'ambito di una proprietà di dipendenza associata

In caso contrario, è significativo digitare esplicitamente i metodi Get e Set statici dei DP collegati?

Esempio:

Se ho ad esempio la seguente dichiarazione:

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

sarebbe meaningfull per farla cambiare come segue, da applicare solo ai TextBoxes?

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

La mia domanda è, perché questo porta ad un'inconsistenza, perché GetValue e SetValue potrebbero essere utilizzati più di qualsiasi tipo e anche nel markup è alcuna possibilità di limitare l'attachement.

Quello che ho fatto in precedenza era che ho aggiunto un'eccezione nel gestore di PropertyChanged e ho sollevato un'eccezione che solo i tipi xy sono consentiti.

Cosa ne pensi?

+0

Buona domanda ... si spera che la mia nuova risposta lo risolva. – Noldorin

+2

Per i metadati, ho desiderato un'altra risposta ma non ho visto nulla. Per la dichiarazione dei metodi di accesso, penso che sia una questione di politica. Se è il senso comune farlo in questo modo, lo farò. Ma per me è un po 'come chiudere il balcone con una grande serratura ma lasciare la porta principale sbloccata. Ma almeno i metodi set-and get mostrano lo scopo del dp allegato. Userò il tuo consiglio ma continuerò a controllare il tipo di destinazione nel gestore di PropertyChanged. Quindi un utente riceverà un'eccezione nel progettista se tenta di utilizzare il DP su un controllo sbagliato. – HCL

risposta

15

Credo che tutto ciò che è necessario fare per limitare il tipo di destinazione delle proprietà collegate è modificare le definizioni dei metodi GetPropertyName e SetPropertyName.

Esempio:

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

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

dove MyTargetType può essere qualsiasi tipo ereditare da DependencyObject.

+2

Beh, non così male ... Ho provato con Visual Studio 2013 e dà il seguente errore se si tenta di associare la proprietà a qualcos'altro: ** La proprietà allegata "AttachedInt" può essere applicata solo ai tipi derivati ​​da "TextBox". ** –

+0

Benoit ha ragione. In VS2013 XAML intellisense ti impedirà di collegarlo a un elemento non supportato. Non uso ReSharper. –

Problemi correlati