2017-02-17 98 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/> 

一个更好的解决办法是用XAML创建一个内容查看(即PlayerTemplate ),那么,你可以做

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

编辑:若y OU要存储数据,你可以做以下

在你的ViewModel类,你必须:

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

当然,您的视图模型应该执行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

相关问题