如何在C#

时间:2018-10-04 14:04:48

标签: c# xamarin data-binding xamarin.forms concatenation

我想将ID与产品名称连接起来,如下图所示

screenshot

问题是我加载到列表中的属性的类型为Object,这里是我的数据结构

public class FabricanteFormResponse
{    
      [JsonProperty(PropertyName = "results")]
       public FabricanteForm Results { get; set; }
}

public class FabricanteForm
{
     [JsonProperty(PropertyName = "columns")]
     public List<int> Columns { get; set; }

     [JsonProperty(PropertyName = "sqs")]
     public List<List<Sqs>> Sqs { get; set; }
}

public class Sqs
{
     [JsonProperty(PropertyName = "field")]
      public string Field { get; set;}

     [JsonProperty(PropertyName = "column")]
      public int Column { get; set; }

     [JsonProperty(PropertyName = "value")]
      public Object Value { get; set; }

}

因此,逻辑是,当列采用值2时,它是乘积;当列采用值1时,它是ID。

POSTMAN

然后,当我打开ViewModel时,创建一个Sqs的ObservableCollection和一个LoadSubstances()方法,当带有LINQ的列为2时,该方法将加载Object类型的此对象的列表

#region Constructor
public ResultadosHDSViewModel()
 {  
    Sqss = new ObservableCollection<Sqs>();

    LoadSustancias();
 }
#endregion


#region Metodos           
 public async void LoadSustancias()
 {          
      var mainViewModel = MainViewModel.GetInstance();

    var sustancias = mainViewModel.FabricanteForm.Results.Sqs.Select(c => c.Where(v => v.Column == 2)
                        .Select(u => u).ToList()).ToList();

      Sqss.Clear();

      foreach (var item in sustancias)
      {
         foreach (var itemSqs in item)
         {
             if (itemSqs.Column == 2)
             {
               Sqss.Add(itemSqs);
              }
          }
      }         
}
#endregion

在我的Vista中,我占据以下绑定

<ListView ItemsSource="{Binding Sqss}"
                  SelectionMode="None">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" 
                                         VerticalOptions="CenterAndExpand" 
                                         Padding="16,0,0,0">
                            <Label Text="{Binding Value}" 
                                       HorizontalOptions="FillAndExpand" 
                                       FontSize="Small" 
                                       TextColor="{StaticResource das.color.texto}"
                                       VerticalOptions="CenterAndExpand" />

                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

由于占用了前面介绍的数据结构,我可以将ID与产品名称连接在一起吗?我可以从我的LoadSubstance方法中做到吗?我应该创建一个新属性吗?

对我有帮助吗?

1 个答案:

答案 0 :(得分:0)

从列表的Sqs中获取相关项目

List<Sqs> item = Sqs[i];
string formattedString = $"({item[0].Value}) {item[1].Value}";
                                                    // e.g. "(2) 10-31 LIMPIADOR DE CONTACTOS"

假设id和product始终是前两个项。


但是,如果您创建一个Product类并将原始的Json属性列表转换为产品列表,则会容易得多

public class Product
{
    public Product()
    {
    }

    public Product(List<Sqs> properties)
    {
        Id = (int)properties[0].Value;
        Name = (string)properties[1].Value;
        Manufacturer = (string)properties[2].Value;
        Keywords = (string)properties[3].Value;
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Manufacturer { get; set; }
    public string Keywords { get; set; }

    public string ProductText => $"({Id}) {Name}";

    public override string ToString() => ProductText;
}

此类具有属性ProductText,并重写ToString以使其根据需要产生格式化的字符串。

Sqss替换为Products

public ObservableCollection<Product> Products { get; set; }

然后,您可以使用{p>在LoadSustancias()中创建产品列表

Products = new ObservableCollection<Product>(mainViewModel.FabricanteForm.Results.Sqs
    .Select(props => new Product(props))
);

现在,您可以将ListView绑定到Products列表,并将标签绑定到<Label Text="{Binding ProductText}" ...