2017-02-17 24 views
2

Xamarin.Formsを使用してプロジェクトを開発しています。実行時に入力フィールドを動的に作成する必要があります。実行時にXamarin.Formsで入力フィールドを動的に追加する方法

たとえば、ユーザーはチームでプレーするプレイヤーの数を尋ねられ、ユーザーが提供するデータに基づいて、各プレーヤーの名前、年齢、連絡先などのフィールドを作成する必要があります。Entryあなたのxaml.csで

+0

良い質問..クイックソリューション:すべてのエントリを表示にし、このビューを表示するには、ユーザーが番号を選択するとfalseにすることができますvisible = trueにするエントリはforループになります。 –

答えて

1

しかし、どのようにこれは、動的に、すなわち、ユーザが入力したプレイヤーの数に基づいて、入力フィールドを追加することで私を助けるでしょうか?

まず、C#で動的に作成するか、追加してXamlで非表示にすることができます。 Xamlの場合、あなたができることは、エントリを追加し、それらを視覚的にfalseに設定することです。x個のエントリを作成する必要はなく、プレイヤの数に応じてデータを収集したいだけです。
だから、まず第一に、ちょうどあなたがしたいフィールドごとに1つのエントリを追加します。

<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にスタックレイアウトを作成してエントリを追加することです。あなたのxaml.csで

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

選手の数が提供された後、あなたは次のように、何が必要データのちょうど1エントリを追加:あなたはのだろう、

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

そして、前に述べたようにもちろん、データを保存するためのボタンがあります。

1

、あなたはXAMLでこの

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

を行うことができ、あなたが持っているよりよい解決策は、XAMLでContentViewを作成することです

<StackLayout x:Name=Panel/> 

のようなもの(すなわちPlayerTemplate場合はY:)、そして、あなたは

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

編集を行うことができますOUは、あなたの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

関連する問題