如何在运行时在Xamarin.Forms中动态添加输入字段

时间:2017-02-17 15:10:43

标签: c# xamarin xamarin.forms

我正在使用Xamarin.Forms开发一个项目,我需要在运行时动态创建输入字段。

例如,系统会要求用户提供团队中玩家的数量,并根据用户提供的数据创建Entry字段,例如姓名,年龄,联系人等。每个球员。

3 个答案:

答案 0 :(得分:2)

在你的xaml.cs中,你可以这样做

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

在你的xaml中,你有类似

的东西
<StackLayout x:Name=Panel/>

更好的解决方案是在xaml中创建一个ContentView(即PlayerTemplate),然后,你可以做到

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

修改:如果要存储数据,可以执行以下操作

在ViewModel类中,您有:

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

当然,你的viewmodel应该实现INotifyPropertyChanged,你应该在设置Players属性时引发事件

然后在您看来,您可以这样做:

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

绑定将更新每个玩家。

答案 1 :(得分:2)

  

但是,这有助于我根据用户输入的玩家数量动态添加输入字段吗?

首先,您可以通过C#动态创建它们,也可以添加它们并在Xaml中隐藏它们。对于Xaml方式,你可以做的是添加条目并将它们的visibily设置为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中,在提供了多少个玩家之后,你只需添加一个你需要的数据条目,如:

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...
}

答案 2 :(得分: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);
}