在C# / WPF中,我能否获取绑定对象的Type()(即使绑定值为空)?

4
我有一个绑定到未知源的绑定对象。我只有这个绑定对象,没有其他查看绑定对象的方法。即使值为空(这就是我的问题所在),我需要找出绑定对象的类型。
我曾经通过将绑定到一个对象上并使用该对象作为获取类型的方式来评估绑定,但我需要知道类型,即使值为空。
例如,我有一个类如下:
public class Customer{
  public string Name { get; set; }
  public int Age { get; set; }
}

现在,如果我有一个绑定到这些属性之一的WPF控件(假设它们是依赖属性),即使该值为空,我也希望获取属性的类型。

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

3个回答

3
你是否愿意使用反射来访问非公共成员?如果是的话,我认为Binding有一个名为CreateBindingExpression的内部方法,返回一个BindingExpression,它有一个名为_listener的私有成员,类型为内部类型PropertyPathListener。它有一个名为LeafType的内部属性,我相信这就是你要找的内容。
虽然这种方法比较混乱,需要信任,并且可能在将来的框架版本中出现故障,但这可能是你寻找所需内容的唯一方法。

哇... 是的,就是这样。我不会去做那个。看起来我只能通过设置“属性”字符串和“源”对象来允许绑定到一个属性。还是谢谢你! :) - Phobis
+1,虽然你不需要费力地获取BindingExpression - 只需使用BindingOperations.GetBindingExpression。但是,从那里开始,您不幸需要诉诸反射以确定源属性的类型。 - Kent Boogaart

0

这只是一个简单的问题

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

我没有DataContext。在我的评估代码范围内,我只有一个Binding。我必须获取绑定指向的对象类型(即使该值为null)。 - Phobis

0

如果值为null,则无法获取类型。如果绑定是到在App.xaml中定义的静态资源,您必须直接解析xaml文件本身才能找到类型;如果它在类中定义,则必须反射才能找到类型。

如果绑定是在代码中完成的,我认为您无法这样做,因为它可能绑定到一个空的局部变量,您甚至无法将其反射出来(或者也许可以,但那对我来说太难了)。如果绑定是在xaml中定义的,您可以合理地解析xaml并尝试跟踪xaml路径,解析其他xaml文件并反映任何属性以将该路径中的绑定引入代码。

这将是一项巨大的痛苦,我非常确定,无论您的最终目标是什么,都可以通过执行其他操作而不是尝试识别即使为空也是类型来实现,而且所需时间远远少于此。


我正在绑定到一个对象的属性。我只是想找到一种访问绑定属性的 PropertyInfo(或类似的东西)的方法。 - Phobis
@Phobis:我并没有想到你会绑定到一个非对象的属性,这只是追踪该对象的方式问题。从XAML中追踪它,然后反射其属性类型可能是可行的,但如果绑定是在代码中定义的,除了边缘反编译之外,可能没有其他方法来执行它。 - Jimmy Hoffa

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