2016-06-10 88 views
3

我需要一些方式來查找視圖/對象的ID。我聽說過FindViewById函數,但它不在我的ContentPage類中。我在哪裏可以找到它?Xamarin Forms上的FindViewById?

上下文:我有ListView裏面的按鈕。我不知道有多少個按鈕。當用戶點擊其中一個按鈕時,我會獲得其ID並在全球範圍內存儲。我想要完成的是找到這個特定的按鈕,該ID存儲在變量中。

<StackLayout x:Name="chooseObjectButtons"> 
     <ListView x:Name="SlotsList" ItemsSource="{Binding .}" > 
     <ListView.ItemTemplate> 
      <DataTemplate> 
      <ViewCell> 
       <ViewCell.View> 
       <StackLayout> 
        <Button Text="{Binding Text}" BackgroundColor="Gray" Clicked="SlotChosen" /> 
       </StackLayout> 
       </ViewCell.View> 
      </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 
+0

您使用Xaml嗎?@ Ludwik11 –

+0

@AkashAmin是的。我正在生成按鈕的列表視圖。當用戶點擊按鈕我得到它的ID。現在我想用這個保存的ID找到這個按鈕。 – Piotrek

+0

在xaml中使用'x:Name',您可以直接在您的後端C#中引用它。 @ Ludwik11 –

回答

2

更改XAML到:

<ListView ItemsSource="{Binding Slots}" > 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <ViewCell> 
      <ViewCell.View> 
      <StackLayout> 
       <Button Text="{Binding Title}" BackgroundColor="Gray" Clicked="Handle_Clicked" Command="{Binding Select}" /> 
      </StackLayout> 
      </ViewCell.View> 
     </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    </ListView> 

手柄點擊:

private Button LastButtonClicked; 

void Handle_Clicked(object sender, System.EventArgs e) 
{ 
    if (LastButtonClicked != null) 
    { 
     // Change background here 
    }  
    LastButtonClicked = (Button)sender; 
    // Do stuff here. 
} 

來處理每個按鈕使用的特定命令:

public List<SlotsButtons> Slots 
{ 
    get 
    { 
     return new List<SlotsButtons> 
     { 
      new SlotsButtons 
      { 
       Title = "T1", 
       Select = new Command(()=>{ 
        // do stuff here when clicked. 
       }) 
      }, 
      new SlotsButtons 
      { 
       Title = "T2", 
       Select = new Command(()=>{ 
        // do stuff here when clicked. 
       }) 
      } 
     }; 
    } 
} 

注意:初始問題答案。

在Xamarin中形成類ContentPagePartial class。 一部分從XAML自動生成,另一部分代表後面的代碼。 XAML生成的Partial class具有按名稱查找視圖的代碼。

正確的名字是FindByName,你不需要在你的部分類中使用它,因爲它已經在生成的部分類中生成了。

如果你想在你的代碼中訪問一個視圖,只需在XAML中給它一個名字。 有一個XAML例如:

<Button x:Name="button" ></Button> 

而且在後面的代碼,你可以這樣做:

button.BorderWidth = 3; 

如果您仍然需要找到某種原因來看,做到這一點:

var button = this.FindByName<Button>("button"); 
+0

對不起,我還沒有完全告訴我正在嘗試做什麼。正如你在問題「我正在生成按鈕的列表視圖」中的一個註釋中看到的那樣。當用戶單擊按鈕時,我得到它的ID,現在我想用這個保存的ID來找到這個按鈕。 – Piotrek

+0

我無法爲每個按鈕設置名稱,因爲我不知道它們中有多少個將在listview中。 – Piotrek

+0

但是在代碼中的某處您必須創建按鈕。在該代碼中爲其生成一個名稱。如果你在for循環中創建按鈕,你可以做一些新的Button(){Name =「Button」+ i}; – jzeferino