首页 > 解决方案 > 如何在 C# 中连接 Object 类型元素的属性

问题描述

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

截屏

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

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。

邮差

然后当我打开我的 ViewModel 时,我创建了一个 ObservableCollection of Sqs 和一个方法 LoadSubstances (),当列为 2 时,它会加载这个 Object 类型的对象列表,使用 LINQ

#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 方法做到这一点吗?我应该创建一个新属性吗?

对我有什么帮助吗?

标签: c#xamarindata-bindingxamarin.formsconcatenation

解决方案


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,让它根据需要生成格式化的字符串。

替换SqssProducts

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

LoadSustancias()然后你可以简单地创建一个产品列表

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

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


推荐阅读