如何在代码中访问x:Name-property – 对于非FrameworkElement对象?

与另一个问题类似,我想通过代码访问对象的x:Name属性,在这种情况下,有问题的对象不是FrameworkElement ,因此没有Name属性。 我也无法访问成员变量。

在我的情况下,我有一个带有命名列的ListView ,并希望扩展ListView类,以便它保持列布局。 对于这个function,我需要命名列,因为其他原因重新使用我需要设置的x:Name属性是有意义的,而不是添加附加的“ColumnName”属性。

我目前的“解决方案”:

  

期望:

  

那么有可能以某种方式获得“x:Name”值吗?

请参阅IanG在以下主题中的答案:
如何从代码隐藏中的XAML代码中读取x:Name属性

不幸的是,这不是x:Name所做的。 x:名称在技术上不是属性 – 它是Xaml指令。 在.NET WPF应用程序的上下文中,x:Name表示:

“我希望能够通过此名称的字段访问此对象。此外,如果此类型恰好具有name属性,请将其设置为该名称。”

这是你需要的第二部分,不幸的是第二部分不适用于ModelUIElement3D,因为该类型没有表示名称的属性。 所以实际上,它意味着“我希望能够通过这个名称的字段访问这个对象。” 就这样。

因此,所有x:Name都可以通过创建具有该特定名称的字段来访问此对象。 如果要获取x:它的名称,则必须迭代所有字段并查看该字段是否是您要查找的对象,在这种情况下,返回字段名称。

他确实提出了一种在代码隐藏文件中执行此操作的方法,尽管我认为当前使用附加属性的方法是一个更好的解决方案

 public string GetName(GridViewColumn column) { var findMatch = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) let fieldValue = field.GetValue(this) where fieldValue == column select field.Name; return findMatch.FirstOrDefault(); }