2017-02-17 8 views
2

Я разрабатываю проект с использованием Xamarin.Forms, где мне нужно создавать поля ввода динамически во время выполнения.Как добавить поля ввода динамически во время выполнения в Xamarin.Forms

Например, пользователю будет предложено указать количество игроков, играющих в команде, и на основе данных, предоставленных пользователем. Мне нужно создать поля Entry, такие как имя, возраст, контакт и т. Д. Для каждого игрока.

+0

хорошее решение question..quick: вы можете поместить все записи на просмотр и сделать этот вид видимым = ложь, когда пользователь может выбрать номер вы сделаете visible = true , и запись появится для цикла. –

ответ

1

Но как бы это помогло мне в добавлении поля ввода динамически, т.е. в зависимости от количества игроков, введенных пользователем?

Прежде всего, вы можете создать их динамически с помощью C# или добавить их и скрыть их в Xaml. В случае Xaml-способа, что вы можете сделать, это добавить записи и установить их видимость на false, вам не нужно создавать x номеров записей, вы просто хотите собирать данные в зависимости от количества игроков.
Итак, прежде всего, просто добавьте одну записи для каждого поля вы хотите:

<Entry x:Name="NameEntry" IsVisible="false" /> 
<Entry x:Name="AgeEntry" IsVisible="false" /> 

Теперь, после того, как пользователь вводит его количество игроков, в первую очередь вы поворачиваете записи, чтобы быть видимыми в вашем xaml.cs :

NameEntry.IsVisible = true; 
AgeEntry.IsVisible = true; 

Вы можете сохранить ваше количество игроков в переменной, и я думаю, у вас будет кнопка для сохранения данных прямо? После каждого щелчка на этой кнопке, вы проверяете, если количество сохраненных данных достигло числа игроков и очистить записи, и когда достигли вы превратить их обратно, чтобы быть невидимым:

NameEntry.Text = string.Empty; 
AgeEntry.Text = string.Empty; 
numberOfSavedData++; 
//your saving logic in your button click 
if (numberOfSavedData == numberOfPlayers) 
{ 
    NameEntry.IsVisible = false; 
    AgeEntry.IsVisible = false; 
    //etc... 
} 

Это не очень динамично создавать их , это просто, чтобы скрыть/показать записи. Теперь, если вы хотите их создать, а затем удалить позже, вы можете сделать это и в своем xaml.cs. Предложение будет создавать макет стека в вашем xaml, чтобы добавить записи к нему.

<StackLayout x:Name="EntriesStackLayout"> 
</StackLayout> 

В ваших xaml.cs, после того, как количество игроков было предусмотрено, добавить только 1 запись о том, какие данные вам нужно, например:

Entry nameEntry = new Entry(); 
Entry ageEntry = new Entry(); 
EntriesStackLayout.Children.Add(nameEntry); 
EntriesStackLayout.Children.Add(ageEntry); 

И, как было сказано выше, вы бы из Конечно, есть кнопка, чтобы сохранить данные, и вы можете сделать то же самое внутри обработчика, как:

nameEntry.Text = string.Empty; 
ageEntry.Text = string.Empty; 
numberOfSavedData++; 
//click handler 
if (numberOfSavedData == numberOfPlayers) 
{ 
    EntriesStackLayout.Children.Remove(nameEntry); 
    EntriesStackLayout.Children.Remove(ageEntry); 
    //etc... 
} 
1

В ваших xaml.cs, вы можете сделать это

for(var i = 0; i < 10; i++) 
{ 
    Panel.Children.Add(new Entry()); 
} 

В вашем XAML, у вас есть что-то вроде

<StackLayout x:Name=Panel/> 

Лучшим решением было бы создание ContentView в XAML (т.е. PlayerTemplate), то вы можете сделать

for(var i = 0; i < 10; i++) 
{ 
    Panel.Children.Add(new PlayerTemplate()); 
} 

Edit: Если у НУ хотите сохранить данные, вы можете сделать следующее

В классе ViewModel, у вас есть:

public IEnumerable<PlayerViewModel> Players {get; set;} 

Конечно, ваш ViewModel должны осуществлять INotifyPropertyChanged и вы должны поднять событие, когда вы установите Players недвижимость

Затем на вашем взгляде, вы можете сделать это:

foreach(var player in myViewModel.Players) 
{ 
    Panel.Children.Add(new PlayerTemplate{ BindingContext = player }); 
} 

привязки обновят каждый игрок.

+0

что делать, если я также хочу ** хранить ** данные, введенные пользователем в каждом поле ввода, в базу данных? @Daniel –

+0

Я отредактировал ответ – Daniel

+0

Решил ли он вашу проблему? Если да, отметьте в качестве ответа. Благодаря! – Daniel

1
for (int x = 1; x < NumOfPlayers; x++) { 
    AddEntry(myLayout, "Player " + x.ToString()); 
} 

private void AddEntry(StackLayout sl, string name) { 

    Label label = new Label() { Text = name }; 
    Entry entry = new Entry() { Placeholder = name }; 

    sl.Children.Add(label); 
    sl.Children.Add(entry); 
} 
+0

Но как это поможет мне в добавлении полей ввода ** динамически ** т.е. на основе количества игроков, введенных пользователем? @Jason –

+0

используйте цикл для вызова метода AddEntry() для как можно большего количества игроков - см. Мое редактирование – Jason