【问题标题】:Silverlight - Programmatically Resolving Binding ExpressionSilverlight - 以编程方式解析绑定表达式
【发布时间】:2012-07-29 08:29:47
【问题描述】:

有没有办法以编程方式解析绑定表达式?我有一个模板化控件,它有很多我不想公开的复杂内部工作原理。它需要一个列表,并公开一个完整项目视图的模板,以及修改单个项目模板的一些细节。我想在我的控件上有三个属性作为绑定路径,所以我可以按如下方式公开一个模板:

<src:MyControl x:Name="MyControl" 
               FullViewTemplate="{StaticResource FullViewTemplate}"
               TopValueBinding="Items[2]"
               BottomValueBinding="Items[6]"
               CategoryBinding="Items[5]"/>

在内部,我想获取整个数据上下文并将其提供给值转换器,这将解析我的可配置绑定路径。像这样的:

PropertyPath path = new PropertyPath("Items[0]");
var value = Convert.ToDecimal(path.Resolve(dataSource));

我目前使用属性名称和反射来提取值,但这不具备处理复杂数据类型的灵活性,并且我不想编写大量的解析和反射逻辑来检索字段价值观。

编辑:或者,能够做这样的事情会很棒:

{Binding Path={TemplateBinding BottomValueMember}, Converter={StaticResource ScaleValueConverter}}

但这似乎不起作用。有什么想法吗?

【问题讨论】:

    标签: silverlight data-binding controltemplate


    【解决方案1】:

    所以 - 经过大量挖掘后,我用以下代码解决了这个问题:

        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?

    现在我只需将整个数据项传入并让转换器处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2012-09-18
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2016-09-30
      • 2011-02-01
      相关资源
      最近更新 更多