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

时间:2011-08-24 07:40:33

标签: c# .net wpf xaml

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

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

我目前的“解决方案”:

<GridViewColumn Header="X" localControls:ExtendedListView.ColumnName="iconColumn" />

所需:

<GridViewColumn Header="X" x:Name="iconColumn" />

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

1 个答案:

答案 0 :(得分:6)

在以下主题中查看IanG的答案:
How to read the x:Name property from XAML code in the code-behind

  

不幸的是,这不是x:Name所做的。 x:名字不是   从技术上讲,它是一个属性 - 它是一个Xaml指令。在一个的背景下   .NET WPF应用程序,x:名称表示:

     

“我希望能够通过此字段访问此对象   名称。此外,如果此类型恰好具有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();
}