如何在 Xamarin.Forms 中的运行时动态添加条目字段

Aja*_*air 4 c# xamarin xamarin.forms

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

例如,用户会被要求输入一个团队中的球员数量,并根据用户提供的数据Entry为每个球员创建诸如姓名、年龄、联系人等字段。

Dan*_*iel 5

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

for(var i = 0; i < 10; i++)
{
    Panel.Children.Add(new Entry());
}
Run Code Online (Sandbox Code Playgroud)

在你的 xaml 中,你有类似的东西

<StackLayout x:Name=Panel/>
Run Code Online (Sandbox Code Playgroud)

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

for(var i = 0; i < 10; i++)
{
    Panel.Children.Add(new PlayerTemplate());
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想存储数据,你可以执行以下操作

在您的 ViewModel 类中,您有:

public IEnumerable<PlayerViewModel> Players {get; set;}
Run Code Online (Sandbox Code Playgroud)

Players当然,您的视图模型应该实现 INotifyPropertyChanged 并且您应该在设置属性时引发事件

那么在你看来,你可以这样做:

foreach(var player in myViewModel.Players)
{
    Panel.Children.Add(new PlayerTemplate{ BindingContext = player });
}
Run Code Online (Sandbox Code Playgroud)

绑定将更新每个玩家。


Pau*_*ram 5

但这将如何帮助我动态添加输入字段,即根据用户输入的玩家数量?

首先,您可以通过 C# 动态创建它们,也可以添加它们并将它们隐藏在 Xaml 中。在 Xaml 方式的情况下,您可以做的是添加条目并将它们的可见性设置为 false,您实际上不需要创建 x 个条目,您只想根据玩家数量收集数据。
因此,首先,只需为您想要的每个字段添加一个条目:

<Entry x:Name="NameEntry" IsVisible="false" />
<Entry x:Name="AgeEntry" IsVisible="false" />
Run Code Online (Sandbox Code Playgroud)

现在,在用户提供他的玩家数量后,首先您将条目设为在您的 xaml.cs 中可见:

NameEntry.IsVisible = true;
AgeEntry.IsVisible = true;
Run Code Online (Sandbox Code Playgroud)

您可以将玩家数量存储在一个变量中,我猜您会有一个按钮来保存数据,对吗?每次点击该按钮后,您检查保存的数据数量是否已达到玩家数量并清除条目,一旦达到,您将它们变回不可见:

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...
}
Run Code Online (Sandbox Code Playgroud)

这并不是真正动态创建它们,这只是为了隐藏/显示条目。现在,如果您想创建它们然后稍后删除它们,您也可以在 xaml.cs 中进行。建议是在您的 xaml 中创建堆栈布局以向其中添加条目。

<StackLayout x:Name="EntriesStackLayout">
</StackLayout>
Run Code Online (Sandbox Code Playgroud)

在您的 xaml.cs 中,提供玩家数量后,您只需添加 1 个所需数据条目,例如:

Entry nameEntry = new Entry();
Entry ageEntry = new Entry();
EntriesStackLayout.Children.Add(nameEntry);
EntriesStackLayout.Children.Add(ageEntry);
Run Code Online (Sandbox Code Playgroud)

如前所述,您当然会有一个按钮来保存数据,您可以在处理程序中执行相同的操作,例如:

nameEntry.Text = string.Empty;
ageEntry.Text = string.Empty;
numberOfSavedData++;
//click handler
if (numberOfSavedData == numberOfPlayers)
{
    EntriesStackLayout.Children.Remove(nameEntry);
    EntriesStackLayout.Children.Remove(ageEntry);
    //etc...
}
Run Code Online (Sandbox Code Playgroud)