从 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】:

您可以通过ChildrenStackLayout 获得所有参赛作品。我使用上一个线程中的相同代码进行引用。

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 调用视图中的方法

从 ViewModel 绑定到 Xamarin.Forms.Maps.Map

从 ViewModel 构造函数 Xamarin.Forms 调用异步方法

使用 Prism Xamarin 表单创建动态 TabbedPage

如何将相同的viewmodel设置为xamarin表单中的新mvvm中的两个视图

使用Prism Xamarin表单创建动态TabbedPage