我可以在C#/ WPF中获取绑定对象的Type()(即使绑定值为null)?

我对未知来源有约束力。 我只有绑定。 我没有其他方法来查看绑定对象。 我需要找出绑定对象的Type,即使该值为null(这是我的问题所在)。

我通过绑定到一个对象来评估绑定,然后使用该对象作为获取Type的方法,但即使值为null,我也需要知道该类型。

例如,我有一个这样的类:

public class Customer{ public string Name { get; set; } public int Age { get; set; } } 

现在,如果我有一个WPF控件绑定到任何这些属性(让我们假设它们是依赖属性)我想获取属性的类型,即使该值为null。

所以,我有一个自定义控件,现在有一个Binding对象,例如代表{Binding Name}。 如何使用C#获取“绑定对象”的类型?

您是否愿意使用反思来访问非公开成员? 如果是这样,我认为Binding有一个名为CreateBindingExpression的内部方法,它返回一个BindingExpression ,它有一个名为_listener的私有成员,内部类型为PropertyPathListener 。 它有一个名为LeafType的内部属性,我相信你正在寻找它。

它很混乱,需要信任,并且在未来的Framework版本中会出现故障,但它可能是获得所需内容的唯一方法。

这应该只是一件事

 MyCustomControl.DataContext != null ? MyCustomControl.GetType() : default(Type); 

如果值为null,则没有要获取的类型。 如果绑定是App.xaml中定义的静态资源,那么你必须解析xaml文件本身以找出类型,如果它在类中定义,你必须反映它以找出类型。

如果绑定是在代码中完成的,我不认为你可以这样做,因为它可以被绑定到一个你甚至无法反映出来的null局部变量(或者你可以,但那可能会结束我的头)。 如果绑定是在xaml中定义的,那么您可以合理地解析xaml并尝试遵循解析其他xaml文件的xaml路径并反映绑定到代码中的路径的任何属性。

这将是一个巨大的痛苦,而且我很确定无论你在这里结束的是什么,都可以在没有荒谬时间的情况下完成,除了尝试识别类型,即使它是空的。