2016-12-02 5 views
1

Просмотров, как 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 как тип.

Как получить атрибут x:Name как строку в коде от object? На этом этапе я не знаю этого типа.

Edit:

Чтобы сделать вещи более ясно, что я хочу опубликовать код. У меня есть нормальный 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> 

В файл кода я могу получить атрибут x:Name, если я nameof(this.myLabelName). Но как это сделать, если у вас есть только 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

ответ

1

Я 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