有没有办法以编程方式解析绑定表达式?我有一个模板控件,有很多复杂的内部工作,我不想暴露。它需要一个列表,并公开一个完整项目视图的模板,以及一些修改单个项目模板的细节。我希望我的控件上有三个属性作为绑定路径,因此我可以按如下方式公开模板:
<src:MyControl x:Name="MyControl"
FullViewTemplate="{StaticResource FullViewTemplate}"
TopValueBinding="Items[2]"
BottomValueBinding="Items[6]"
CategoryBinding="Items[5]"/>
在内部,我想获取整个datacontext并将其提供给值转换器,它将解析我的可配置绑定路径。像这样:
PropertyPath path = new PropertyPath("Items[0]");
var value = Convert.ToDecimal(path.Resolve(dataSource));
我目前使用属性名称和反射来提取值,但是这不能灵活地处理复杂的数据类型,我不想编写大量的解析和反射逻辑来检索字段值。
编辑:或者,能够做这样的事情会很棒:
{Binding Path={TemplateBinding BottomValueMember}, Converter={StaticResource ScaleValueConverter}}
但这似乎不起作用。有什么想法吗?
答案 0 :(得分:0)
所以 - 经过多次挖掘后,我用以下代码解决了这个问题:
public class BindingEvaluator : DependencyObject
{
private static readonly DependencyProperty TargetProperty =
DependencyProperty.Register(
"Target",
typeof(object),
typeof(BindingEvaluator),
new PropertyMetadata(null));
private object Target
{
get { return GetValue(TargetProperty); }
set { SetValue(TargetProperty, value); }
}
private static BindingEvaluator _instance = new BindingEvaluator();
private static BindingEvaluator Instance
{
get { return _instance; }
}
public static object Eval(Object instance, string path)
{
Binding binding = new Binding(path) { Source = instance };
BindingOperations.SetBinding(Instance, TargetProperty, binding);
return Instance.Target;
}
}
相信这篇文章的回答:Is there a way to get a property value of an object using PropertyPath class?
现在我只传递整个数据项并让转换器处理它。