Xamarin.Formsを使用してプロジェクトを開発しています。実行時に入力フィールドを動的に作成する必要があります。実行時にXamarin.Formsで入力フィールドを動的に追加する方法
たとえば、ユーザーはチームでプレーするプレイヤーの数を尋ねられ、ユーザーが提供するデータに基づいて、各プレーヤーの名前、年齢、連絡先などのフィールドを作成する必要があります。Entry
あなたのxaml.csで
Xamarin.Formsを使用してプロジェクトを開発しています。実行時に入力フィールドを動的に作成する必要があります。実行時にXamarin.Formsで入力フィールドを動的に追加する方法
たとえば、ユーザーはチームでプレーするプレイヤーの数を尋ねられ、ユーザーが提供するデータに基づいて、各プレーヤーの名前、年齢、連絡先などのフィールドを作成する必要があります。Entry
あなたのxaml.csで
しかし、どのようにこれは、動的に、すなわち、ユーザが入力したプレイヤーの数に基づいて、入力フィールドを追加することで私を助けるでしょうか?
まず、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);
そして、前に述べたようにもちろん、データを保存するためのボタンがあります。
、あなたは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 });
}
バインディングは、各プレーヤーを更新します。
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);
}
しかし、これは、ユーザーが入力したプレイヤーの数に基づいて**動的に**入力欄を追加するのにどのように役立ちますか? @Jason –
ループを使用して、必要な数のプレイヤーに対してAddEntry()メソッドを呼び出します。 – Jason
良い質問..クイックソリューション:すべてのエントリを表示にし、このビューを表示するには、ユーザーが番号を選択するとfalseにすることができますvisible = trueにするエントリはforループになります。 –