2012-07-31 84 views
0

有没有什么办法以编程方式解析绑定表达式?我有一个模板化的控件,它有很多复杂的内部工作,我不想公开。它接受一个列表,并公开一个完整项目视图的模板,以及一些修改单个项目模板的细节。我想在我的控制,结合路径有三个属性,这样我就可以如下暴露模板:Silverlight - 以编程方式解决绑定表达式

<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

所以 - 以后多挖我解决了这个用下面的代码:

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?

现在我只是通过整个数据项,并有转换器搞定此事。