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
相关产品推荐
相关产品推荐

