从BindingExpression中获取源属性类型

5
我正在尝试查找绑定表达式的源属性类型。我想这样做是因为我想使用UpdateSourceExceptionFilter来提供比通用的“无法转换”更有用的错误消息。
在.NET 4.5中,我使用反射和ResolvedSource以及ResolvedSourcePropertyName来获取源属性类型,如下所示:
PropertyInfo sourceProperty = expr.ResolvedSource.GetType().GetProperty(expr.ResolvedSourcePropertyName);
Type propertyType = sourceProperty.PropertyType;

这很好地实现了。然而,这两个BindingExpression属性仅在.NET 4.5中引入,而我仍在使用4.0(由于Windows XP无法升级)。
那么,在.NET 4.0中有没有好的方法来解决这个问题?我考虑过使用反射获取内部的SourceItem和SourcePropertyName属性或者只是私有的Worker来获取这些值,但我宁愿避免访问内部/私有属性或字段(我认为这也需要我对信任做一些事情?有哪些影响?)。
3个回答

5

虽然不太美观,但没有访问私有方法的权限:

string[] splits = expr.ParentBinding.Path.Path.Split('.');
Type type = expr.DataItem.GetType();
foreach (string split in splits) {
    type = type.GetProperty(split).PropertyType;
}

因此,我们能够解析源属性。

如果我可以假设所有路径都像这样简单,那么我想那将是一个可接受的解决方案(它们现在确实是这样)。谢谢! - poke

2
我在代码中使用这个来查找源属性类型。
        BindingExpression bindingExpression = BindingOperations.GetBindingExpression(this, SelectedItemProperty);
        object s = bindingExpression?.ResolvedSource;
        string pn = bindingExpression?.ResolvedSourcePropertyName;

        var type = s?.GetType().GetProperty(pn)?.PropertyType;

0

这里有一个独立于内部/私有.NET对象的解决方案。

当从父控件使用DataContext时,属性expr.ResolvedSourcenull,因此它不会有用。

找到源类型的原因是什么?

为什么不使用简单的String.Format("Binding has exception in path {0}", expr.ParentBinding.Path.Path?? String.Empty)呢?


我对绑定目标(组件)不感兴趣,但我对绑定源很感兴趣。我既不知道绑定目标也不知道应用绑定的属性,但我也不感兴趣;我从delegate中获取BindingExpression。顺便说一句,你的代码可以简化为TextBox.TextProperty.PropertyType - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接