【问题标题】:WPF How should I evaluate a property path?WPF 我应该如何评估属性路径?
【发布时间】:2011-01-13 19:57:33
【问题描述】:

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

我显然可以自己解析它,但它是一个 hack,我希望路径支持 comboBox.SelectedValuePath 所做的一切(为了保持一致性)。

结果(感谢 Aran Mulholland):

不确定这个性能,但我现在不太关心性能。

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

【问题讨论】:

  • 需要注意的是,当Result属性为object类型时,Target中DependencyProperty的声明类型为IEnumerable?
  • @dtm 可能只是我的错误——发布了中间版本而不是最终版本。然而那是很久以前的事了,我不记得了。如果我找到此代码,我会更正问题,否则,如果您对其进行了测试,请告诉我您的发现。
  • 我确实为依赖属性和属性本身实现了类似的匹配类型;但是,令人惊讶的是,如果我用 IEnumerable 代替 DepedencyProperty.Register 中的 Object,它仍然有效。不知道该怎么做...

标签: c# wpf path properties


【解决方案1】:

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

【讨论】:

  • 我在奇怪的情况下也使用它,我确实想知道它的性能,但是 wpf 到处都使用绑定,所以还有一个......
  • WPF 可能有缓存,而当前形式的代码没有。至少在多个调用之间缓存 Binding 理论上会更好,但除非我注意到速度变慢,否则我不太关心验证。 :)
猜你喜欢
  • 2015-07-30
  • 2020-11-20
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多