从 ViewModel Xamarin 中的动态表单中获取条目值
Posted
技术标签:
【中文标题】从 ViewModel Xamarin 中的动态表单中获取条目值【英文标题】:Get the Entry Value from Dynaimc Form in ViewModel Xamarin 【发布时间】:2021-08-06 19:49:39 【问题描述】:在我的 Xamarin 应用程序中,我收到了 Dynamic Form from Server & add in XML Entry Control。
有多个Entry并且它们是动态的(它可以是任何数字),因为我不知道数字和它们的名字,我无法在ViewModel中编写可绑定属性来获取进入的价值。
有没有办法从动态表单中获取Entry的值?
视图模型
编写从 API 获取动态字段的代码
Uri uri = new Uri(string.Format("http://example.com/entry"));
HttpClient httpClient = new HttpClient(new NativeMessageHandler());
HttpResponseMessage response = await httpClient.GetAsync(uri);
string entries = await response.Content.ReadAsStringAsync();
RootObject list = JsonConvert.DeserializeObject<RootObject>(entries);
form = new List<Form>();
form = list.data.FirstOrDefault().form.ToList();
public List<Form> forms get; set;
将 json 转换为类,然后获取 json 数据列表。
public class Rootobject
public bool success get; set;
public Datum[] data get; set;
public class Datum
public Form[] form get; set;
public class Form
public string label get; set;
public string name get; set;
public string type get; set;
public int max_length get; set;
public bool required get; set;
【问题讨论】:
为什么不将 Entry Text 属性绑定到Form
类上的属性?
当它们是动态的(我不知道有名称和数字)时,我将如何获取文本(在应用程序的其他地方,当我想获取用户在 Entry 中输入的值时,在Viewmodel,我必须使用 Bindable Properties).. 但是我该怎么做呢?
在 Form 类上创建一个名为“Value”的属性。将 Entry 的 Text 属性绑定到 Value。然后在代码的其他地方,您可以通过引用该列表来获取值
想象一个绑定到“表单”的 ListView,并显示一个“名称”。你会怎么做? Form
类(模型)中将有一个 name
属性。这与您的 BindableLayout 所需的绑定相同,无论是标签还是内部条目。
我发布了一个小例子“在你的 Form 类上创建一个名为“Value”的属性”。请看一下,这是你想要我做的吗?
【参考方案1】:
您可以通过Children
或StackLayout
获得所有参赛作品。我使用上一个线程中的相同代码进行引用。
Xaml:
<StackLayout>
<StackLayout x:Name="DynamicEntry" BindableLayout.ItemsSource="Binding forms">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Entry Placeholder="Binding label" MaxLength="Binding max_length" />
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
<Button Clicked="Button_Clicked"></Button>
</StackLayout>
后面的代码:
private void Button_Clicked(object sender, EventArgs e)
var entries = DynamicEntry.Children;
foreach (var item in entries)
var entry = item as Entry;
var text = entry.Text;
【讨论】:
此 Code behind 部分只能在.xml.cs
文件中使用,而不能在 ViewModel 中使用。
如果您想从用户输入的条目中获取值并将其传输到视图模型,您可以在视图模型中创建一个属性,然后获取要更新的值。但我不明白not in ViewModel
是什么意思?
这是我的全部问题,我将如何在视图模型中创建属性,而我对条目一无所知(名称或它们有多少)?
@Jason 建议我“在您的 Form 类上创建一个名为“Value”的属性”。我在更新部分发布了上面的代码,这是他的意思吗?
DynamicEntry
是 xaml 中 StackLayout
的名称。【参考方案2】:
在@Jason的cmets和建议的帮助下,终于解决了。
使用ObservableCollection
获取和设置动态表单。
private ObservableCollection<Form> _form = new ObservableCollection<Form>();
public ObservableCollection<Form> form
get => _form;
set => this.RaiseAndSetIfChanged(ref _form, value);
名为“Value”的表单类的属性。将 Entry 的 Text 属性绑定到 Value。
<Entry Text="Binding Value" />
public class Form
// Code
public string Value get; set;
public ObservableCollection<Form> Value
get => _form;
set => this.RaiseAndSetIfChanged(ref _form, value);
通过引用该列表获取值的代码
foreach (var item in Value.ToList())
item.Value.ToString();
【讨论】:
如果Value
是一个字符串,那么在上面使用ToString()
是没有意义的
已删除,谢谢.. 有一件事,我如何检查Value
,看看它是否为空?
string.IsNullOrEmpty()
以上是关于从 ViewModel Xamarin 中的动态表单中获取条目值的主要内容,如果未能解决你的问题,请参考以下文章
从 ViewModel 绑定到 Xamarin.Forms.Maps.Map
从 ViewModel 构造函数 Xamarin.Forms 调用异步方法
使用 Prism Xamarin 表单创建动态 TabbedPage