2009-05-18 18 views

risposta

12

Riutilizzare PropertyPath è allettante in quanto supporta l'attraversamento di proprietà annidate mentre si indicano e si indicizzano. Potresti scrivere tu stesso una funzionalità simile, ho me stesso in passato, ma comporta un parsing di testo semi-complicato e molto lavoro di riflessione.

Come sottolinea Andrew, è possibile riutilizzare PropertyPath semplicemente da WPF. Suppongo che tu voglia solo valutare quel percorso contro un oggetto che hai nel qual caso il codice è un po 'coinvolto. Per valutare il PropertyPath deve essere utilizzato in un binding con un oggetto DependencyObject. Per dimostrarlo ho appena creato un semplice DependencyObject chiamato BindingEvaluator che ha una singola DependencyProperty. La vera magia quindi avviene chiamando BindingOperations.SetBinding che applica l'associazione in modo che possiamo leggere il valore valutato.

var path = new PropertyPath("FullName.FirstName"); 

var binding = new Binding(); 
binding.Source = new Person { FullName = new FullName { FirstName = "David"}}; // Just an example object similar to your question 
binding.Path = path; 
binding.Mode = BindingMode.TwoWay; 

var evaluator = new BindingEvaluator(); 
BindingOperations.SetBinding(evaluator, BindingEvaluator.TargetProperty, binding); 
var value = evaluator.Target; 
// value will now be set to "David" 


public class BindingEvaluator : DependencyObject 
{ 
    public static readonly DependencyProperty TargetProperty = 
     DependencyProperty.Register(
      "Target", 
      typeof (object), 
      typeof (BindingEvaluator)); 

    public object Target 
    { 
     get { return GetValue(TargetProperty); } 
     set { SetValue(TargetProperty, value); } 
    } 
} 

Se si voleva estendere questo si potrebbe cablare gli eventi PropertyChanged per sostenere valori di lettura che cambiano. Spero che aiuti!

+1

Come risponderesti a quella proprietà? –

+0

Ho appena aggiornato l'esempio di codice per includere l'aggiornamento del target. Devi solo assicurarti che Binding sia TwoWay e fornire un setter. –

0

Non vedo alcun motivo per cui non è possibile riutilizzarlo.

Vedi PropertyPath:

Implementa una struttura di dati per descrivere una proprietà come un percorso sotto un'altra proprietà, o sotto un tipo possedere. I percorsi delle proprietà vengono utilizzati nei dati associazione agli oggetti e negli storyboard e nelle timeline per le animazioni.

Problemi correlati