【问题标题】:How to access x:Name-property in code - for non FrameworkElement objects?如何在代码中访问 x:Name-property - 对于非 FrameworkElement 对象?
【发布时间】:2011-08-24 07:40:32
【问题描述】:

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

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

我目前的“解决方案”:

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

期望:

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

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

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

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

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

    “我希望能够通过 this 的一个字段访问这个对象 姓名。另外,如果这个类型恰好有一个 name 属性,请设置 就是那个名字。”

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

    因此,x:Name 所做的只是让您通过创建具有该特定名称的字段来访问该对象。如果你想得到它的 x:Name,你必须遍历你的所有字段,看看这个字段是否是你正在寻找的对象,在这种情况下,返回字段名称。

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

    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();
    }
    

    【讨论】:

    • 谢谢,这有帮助:) 猜猜附加属性确实更合适。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2012-04-17
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多