2016-12-02 51 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作爲類型。

如何從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

回答

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

相關問題