【问题标题】:Get the Entry Value from Dynaimc Form in ViewModel Xamarin从 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”的属性”。请看一下,这是你想要我做的吗?

标签: c# .net xml xamarin xamarin.forms


【解决方案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()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2015-05-18
  • 2019-10-01
相关资源
最近更新 更多