我正在使用Xamarin.Forms开发一个项目,我需要在运行时动态创建输入字段。
例如,系统会要求用户提供团队中玩家的数量,并根据用户提供的数据创建Entry
字段,例如姓名,年龄,联系人等。每个球员。
答案 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);
}