2016-06-10 5 views
3

Мне нужно найти способ/объект по его идентификатору. Я слышал о функции FindViewById, но этого нет в моем классе ContentPage. Где я могу найти его?FindViewById на форматах Xamarin?

Контекст: У меня есть ListView с кнопками внутри. Я не знаю, сколько кнопок есть. Когда пользователь нажимает на одну из этих кнопок, я получаю его идентификатор и сохраняю его по всему миру. То, что я хочу выполнить, - найти эту конкретную кнопку, какой идентификатор хранился в переменной.

<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 да, я. Я создаю список кнопок. Когда пользователь нажимает кнопку, я получаю свой идентификатор. Теперь я хочу найти эту кнопку, используя этот сохраненный идентификатор. – Piotrek

+0

Используйте 'x: Name' в xaml, вы можете напрямую ссылаться на него на своем backend 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 Forms класс ContentPage является Partial class. Одна часть автоматически генерируется из XAML, а другая представляет код позади. У XAML generated: Partial class Введите код, который вы видите на картинке.

Правильное имя FindByName, и вам не нужно использовать это в своем частичном классе, потому что оно уже сделано в сгенерированном частичном классе.

Если вы хотите получить доступ к виду в своем коде, просто укажите его в XAML. Существует пример XAML:

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

И в вашем коде позади вы могли бы сделать что-то вроде:

button.BorderWidth = 3; 

Если вам все еще нужно найти точку зрения по некоторым причинам, это сделать:

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

Простите, я точно не сказал, что я пытаюсь сделать. Как вы можете видеть в одном из комментариев под вопросом «Я генерирую список кнопок. Когда пользователь нажимает кнопку, я получаю свой идентификатор. Теперь я хочу найти эту кнопку, используя этот сохраненный идентификатор». – Piotrek

+0

Я не могу установить имя для каждой из кнопок, потому что я не знаю, сколько из них будет в списке. – Piotrek

+0

Но где-то в коде вам нужно создать кнопки. В этом коде создайте для него имя. Если вы создаете кнопки внутри цикла for, вы можете сделать что-то вроде новой Button() {Name = "Button" + i}; – jzeferino

Смежные вопросы