I am writing a custom control, and I have a property path as string (think comboBox.SelectedValuePath
).
What is the best way in code to evaluate this string for a arbitrary object?
I obviously can just parse it myself, but it is a hack, and I want the path to support everything comboBox.SelectedValuePath
does (for consistency).
Result (thanks to Aran Mulholland):
Not sure about performance of this, but I do not care much for the performance right now.
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;
}
}
Create an object that has one dependency property of type object, set the binding on it with your property path as the path, and your arbitrary object as the source. the binding will execute and you can see what (if anything) is at the end of the property path. This is the only way i have found to do this kind of thing in code. you could write a recursive reflection engine that could follow a property path, but its already been done, we use it when we bind. take you five minutes to write :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With