如何从对象中获取Xamarin.Forms元素的名称?

问题描述:

Button,Entry,Label,Picker等的视图可以具有x:Name属性。如何从对象中获取Xamarin.Forms元素的名称?

<Label x:Name="myLabelName" Text="Some text" /> 

x被定义为xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

现在我想处理未分类的项目,因此我使用object作为类型。

如何从object获得x:Name属性作为字符串的代码?在这个阶段我不知道这种类型。

编辑:

为了让事情更清楚,我想发布一些代码。我有一个正常的XAML页面这样的:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="XamlSamples.HelloXamlPage"> 
    <Label x:Name="myLabelName" Text="Some text" /> 
</ContentPage> 

在代码隐藏文件,我可以,如果我做nameof(this.myLabelName)得到了x:Name属性。但是,如果只有object,这是如何完成的?

public partial class HelloXamlPage 
{ 
    public HelloXamlPage() 
    { 
     InitializeComponent(); 

     List<string> itemsWhichPassTheCheck = this.Check(new List<object>() { this.myLabelName }); 
    } 
} 

private List<string> Check(List<object> itemList) 
{ 
    // do some check here ... 
    // here I have only object and I want to get the x:Name attribute thereof 
} 
+0

当你想得到元素的属性名称。我的意思是当事件或何时加载? –

+0

不知道你的意思。用户按下一个按钮,然后我想进行一些检查。在这里我需要访问name属性。 – testing

我100%肯定有一种方法重构你的代码,以避免你的需要,但回答的缘故,这里是你如何能得到任何物体的名称:

我们肯定知道用x:Name标记的任何对象将创建一个同名的字段。

所以,使用反射,您应该能够获取页面中定义的所有字段,将它们与您的对象进行比较,并在匹配时返回字段名称。

我没有测试过这一点,但应该工作,或至少把你在正确的轨道上

string GetNameOf(object topLevelXaml, object reference) 
{ 
    var fields = topLevelXaml.GetType().GetFields(); 
    foreach (var fi in fields) { 
     var value = fi.GetValue(topLevelXaml); 
     if (value != reference) 
      continue; 
     return fi.Name; 
    } 
    return null; 
} 

但同样,你不应该大概需要这个的。

+0

由于其保护级别*我无法访问*'ReflectionExtensions.GetFields(Type)'。现在我使用'GetRuntimeFields()'来取代名称。对于'topLevelXaml'我使用'this'(当前页面)。但你是对的,我会重新思考我的方法。 – testing