2010-02-06 8 views
10

Sto scrivendo un controllo personalizzato e ho un percorso di proprietà come stringa (si consideri comboBox.SelectedValuePath).
Qual è il modo migliore nel codice per valutare questa stringa per un oggetto arbitrario?WPF Come dovrei valutare un percorso di proprietà?

Ovviamente posso solo analizzarlo da solo, ma è un trucco, e voglio il percorso per supportare tutto ciò che fa comboBox.SelectedValuePath (per coerenza).

Risultato (grazie a Aran Mulholland):

Non sono sicuro circa le prestazioni di questo, ma non mi interessa tanto per le prestazioni in questo momento.

public class BindingEvaluator { 
    #region Target Class 

    private class Target : DependencyObject { 
     public static readonly DependencyProperty ResultProperty = DependencyProperty.Register(
      "Result", typeof(IEnumerable), typeof(BindingEvaluator) 
     ); 

     public object Result { 
      get { return this.GetValue(ResultProperty); } 
      set { this.SetValue(ResultProperty, value); } 
     } 
    } 

    #endregion 

    public object GetValue(object source, string propertyPath) { 
     var target = new Target(); 
     BindingOperations.SetBinding(target, Target.ResultProperty, new Binding(propertyPath) { 
      Source = source, 
      Mode = BindingMode.OneTime 
     }); 
     return target.Result; 
    } 
} 
+0

E 'da notare che il tipo dichiarato di DependencyProperty in Target è IEnumerable quando la proprietà Result è di tipo object? – dtm

+0

@dtm probabilmente è solo il mio errore - ha pubblicato la versione intermedia invece del finale. comunque è stato tanto tempo fa e non ricordo. se trovo questo codice, correggo la domanda, altrimenti se l'hai testato per favore fammi sapere le tue scoperte. –

+0

Ho implementato qualcosa di simile con i tipi corrispondenti per la proprietà di dipendenza e la proprietà stessa; tuttavia, e sorprendentemente, funziona ancora se sostituisco IEnumerable al posto di Object in DepedencyProperty.Register. Non sai cosa fare di questo ... – dtm

risposta

6

Creare un oggetto che ha una proprietà di dipendenza di tipo di oggetto, impostare il legame su di esso con il vostro percorso proprietà come il percorso, e il vostro oggetto arbitrario come origine. l'associazione verrà eseguita e potrai vedere cosa (se non altro) si trova alla fine del percorso della proprietà. Questo è l'unico modo in cui ho trovato di fare questo genere di cose nel codice. potresti scrivere un motore di riflessione ricorsivo che potrebbe seguire un percorso di proprietà, ma è già stato fatto, lo usiamo quando leghiamo. ti occorrono cinque minuti per scrivere :)

+0

Grazie, questo funziona, aggiungendo il codice risultante alla domanda. –

+1

lo uso anche nel caso strano, mi chiedo delle prestazioni, ma wpf usa il binding dappertutto, quindi qual è l'altro ... –

+1

WPF potrebbe avere il caching in atto, mentre il codice nella forma attuale no. Almeno il caching del Binding tra più chiamate può teoricamente essere migliore, ma non mi interessa abbastanza verificare se non noto il rallentamento. :) –

Problemi correlati