2010-02-06 53 views
10

我正在写一个自定义控件,我有一个属性路径作为字符串(想想comboBox.SelectedValuePath)。
代码中为任意对象评估此字符串的最佳方式是什么?WPF我应该如何评估属性路径?

我明显可以自己解析它,但它是一个黑客,我想路径支持一切comboBox.SelectedValuePath(一致性)。

结果(感谢阿兰穆赫兰):

不知道关于这样的表现,但我不为业绩在意现在。

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; 
    } 
} 
+0

是否注意到当Result属性是类型对象时,Target中DependencyProperty的声明类型是IEnumerable? – dtm 2013-06-04 23:14:39

+0

@dtm可能只是我的错误 - 发布中间版本而不是最终版本。不过那是很久以前的事了,我不记得了。如果我找到这个代码,我会纠正这个问题,否则如果你测试了它,请让我知道你的发现。 – 2013-06-04 23:47:48

+0

我没有实现类似这样的依赖项属性和属性本身匹配的类型;然而,令人惊讶的是,它仍然有效,如果我用DepedencyProperty.Register中的Object代替IEnumerable。不知道该怎么做... – dtm 2013-06-05 19:58:17

回答

6

创建具有类型的对象,一个依赖属性的对象,设置您的属性路径的路径,你作为源任意对象就可以了绑定。绑定将会执行,您可以看到属性路径末尾有什么(如果有的话)。这是我发现在代码中做这种事情的唯一方法。你可以编写一个递归反射引擎,它可以遵循属性路径,但它已经完成了,我们在绑定时使用它。带你五分钟后写:)

+0

谢谢,这个工程,将结果代码添加到问题。 – 2010-02-06 12:23:32

+1

我在奇怪的情况下使用它,我对性能感到好奇,但是wpf使用绑定遍布整个地方,所以另一个... – 2010-02-06 12:28:42

+1

WPF可能有缓存,而当前形式的代码没有。至少缓存多个调用之间的绑定在理论上可以更好,但我不关心足够的验证,除非我注意到放缓。 :) – 2010-02-06 12:34:59