Voglio ottenere un valore di una proprietà nidificata di un oggetto (qualcosa come Person.FullName.FirstName). Ho visto che in .Net esiste una classe denominata PropertyPath, che WPF utilizza per uno scopo simile in Binding. C'è un modo per riutilizzare il meccanismo di WPF, o dovrei scriverne uno da solo.Esiste un modo per ottenere un valore di proprietà di un oggetto utilizzando la classe PropertyPath?
Esiste un modo per ottenere un valore di proprietà di un oggetto utilizzando la classe PropertyPath?
risposta
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!
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.
- 1. Esiste un modo per convertire un array in proprietà di classe?
- 2. Come posso salvare un oggetto Objective-C che non è un oggetto elenco di proprietà o esiste un modo migliore per farlo rispetto a un elenco di proprietà?
- 3. Ottenere oggetto nidificato Proprietà Valore utilizzando la riflessione
- 4. Utilizzando LINQ, come trovo un oggetto con un valore di proprietà dato da un elenco?
- 5. Come ottenere un valore della proprietà utilizzando la riflessione
- 6. Esiste un modo per rinominare chiavi oggetto js utilizzando underscore.js
- 7. Ottenere un singolo valore da un oggetto JSON utilizzando JSONPath
- 8. Esiste un modo elegante per impostare un valore predefinito per una proprietà in C#?
- 9. Ottenere un valore del dizionario utilizzando Reflection
- 10. Esiste un modo più semplice per ottenere il valore di frontend di un attributo?
- 11. Esiste un modo per ottenere il valore String di un HttpEntity quando EntityUtils.toString() restituisce un'eccezione?
- 12. Esiste un metodo .NET integrato per ottenere tutte le proprietà e i valori per un oggetto?
- 13. Listener per la proprietà valore cambia in un oggetto JavaScript
- 14. jQuery - Ottenere classe di un elemento tramite la proprietà event.target
- 15. C# foreach (proprietà nell'oggetto) ... Esiste un modo semplice per farlo?
- 16. dando un oggetto di classe un valore C#
- 17. AppleScript: ottenere un elenco di tutte le proprietà di un oggetto o classe
- 18. Esiste un modo per memorizzare o materializzare un oggetto IEnumerable?
- 19. Come posso ottenere il tipo (classe) di una proprietà di un oggetto di dominio Grails?
- 20. Esiste un modo per fornire un valore predefinito per un alias di ambito isolato?
- 21. iterazione proprietà di un oggetto JavaScript utilizzando jQuery
- 22. Ottenere dinamicamente un valore da un oggetto dinamico
- 23. Valore di proprietà di un oggetto String in JavaScript
- 24. Ordinamento di un elenco VB.net per un valore di classe
- 25. Esiste un modo pulito per assegnare la classe di un tipo generico a una variabile?
- 26. utilizzando la riflessione di ottenere tutte le proprietà di un oggetto non implementato da un'interfaccia
- 27. Esiste un modo per eseguire un elenco di diversi metodi di azione su un oggetto in Nunit utilizzando TestCase?
- 28. Ottenere l'indice di un oggetto in un arraylist;
- 29. Come aggiornare una proprietà di un oggetto JSON utilizzando NewtonSoft
- 30. modifica di un array in un oggetto (maiuscolo) aggiungendo un valore utilizzando un punto
Come risponderesti a quella proprietà? –
Ho appena aggiornato l'esempio di codice per includere l'aggiornamento del target. Devi solo assicurarti che Binding sia TwoWay e fornire un setter. –