You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中Code Behind动态创建控件后如何获取用户输入值

动态生成表单控件取值实现

现有实现代码

XAML中预留的布局容器:

<StackLayout x:Name="hAcumulativas"/>

动态生成控件的遍历逻辑:

foreach (var item in _vm.ListaTipoHora)
{
    if (item.Acumula == "S")
        IncluirFilhosHAcumulativas(item.Descricao, string.Empty);
    if (item.Acumula == "N")
        IncluirFilhosHNaoAcumulativas(item.Descricao, string.Empty);
}

累积类字段的控件生成方法,会成对添加加粗标签和数值输入框:

private void IncluirFilhosHAcumulativas(string label, string entry)
{
    hAcumulativas.Children.Add(new Label
    {
        Text = label,                
        FontAttributes = FontAttributes.Bold,
    });
    hAcumulativas.Children.Add(new Entry
    {
        Text = entry ,
        Placeholder = "Informe Hodômetro/Horímetro",
        HorizontalOptions = LayoutOptions.CenterAndExpand,
        Keyboard = Keyboard.Numeric
    });
}

核心问题

动态生成控件时未配置数据绑定,点击保存按钮时无法正确获取所有输入框的用户输入值,无法组装列表回传ViewModel。

实现方法

方案1:按控件固定顺序遍历(适配现有代码无需修改生成逻辑)

当前控件生成规则是固定的:每1个Label和1个Entry为一组依次添加,直接按步长2遍历hAcumulativas.Children集合即可,两两一组匹配标签和输入值。
保存按钮的点击事件中添加如下取值逻辑:

private void SaveButton_Clicked(object sender, EventArgs e)
{
    var formResult = new List<(string FieldLabel, string InputValue)>();
    // 步长设为2,每次处理一组控件
    for (int i = 0; i < hAcumulativas.Children.Count; i += 2)
    {
        // 加类型判断避免索引越界或类型不匹配报错
        if (hAcumulativas.Children[i] is Label label && hAcumulativas.Children[i+1] is Entry input)
        {
            formResult.Add((
                FieldLabel: label.Text,
                InputValue: input.Text?.Trim() ?? string.Empty
            ));
        }
    }
    // 将组装完成的结果赋值给ViewModel对应属性,执行后续保存逻辑
    _vm.FormSubmitData = formResult;
}

方案2:通过唯一标识匹配(更易维护,适配后续控件结构调整)

如果后续可能调整控件生成顺序、新增其他类型控件,建议在创建Entry时给ClassId属性绑定对应业务字段的唯一ID,遍历的时候直接筛选所有Entry子控件即可,不需要依赖固定排列顺序。
首先修改控件生成方法,传入字段唯一标识:

// 调用方法时传入字段唯一ID,比如item.Id
// IncluirFilhosHAcumulativas(item.Id, item.Descricao, string.Empty);
private void IncluirFilhosHAcumulativas(string fieldId, string label, string entry)
{
    hAcumulativas.Children.Add(new Label
    {
        Text = label,                
        FontAttributes = FontAttributes.Bold,
    });
    hAcumulativas.Children.Add(new Entry
    {
        ClassId = fieldId, // 绑定字段唯一标识
        Text = entry ,
        Placeholder = "Informe Hodômetro/Horímetro",
        HorizontalOptions = LayoutOptions.CenterAndExpand,
        Keyboard = Keyboard.Numeric
    });
}

保存时的遍历逻辑简化为:

private void SaveButton_Clicked(object sender, EventArgs e)
{
    var formResult = new List<(string FieldId, string InputValue)>();
    foreach (var child in hAcumulativas.Children)
    {
        if (child is Entry input)
        {
            formResult.Add((
                FieldId: input.ClassId,
                InputValue: input.Text?.Trim() ?? string.Empty
            ));
        }
    }
    _vm.FormSubmitData = formResult;
    // 执行保存逻辑
}

上述逻辑对IncluirFilhosHNaoAcumulativas方法生成的控件同样生效,只要该方法也是按Label+Entry的结构生成控件,或生成Entry时同样配置了ClassId即可。

内容的提问来源于stack exchange,提问作者Jonatas Freitas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:12:20