2016-06-10 91 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