c# - 如何在 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 方法做到这一点吗?我应该创建一个新属性吗?
对我有什么帮助吗?
解决方案
从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; }
LoadSustancias()
然后你可以简单地创建一个产品列表
Products = new ObservableCollection<Product>(mainViewModel.FabricanteForm.Results.Sqs
.Select(props => new Product(props))
);
现在您可以将您绑定ListView
到Products
列表并将标签绑定到<Label Text="{Binding ProductText}" ...
.
推荐阅读
- r - 根据 R 中的两个索引,为每一行获取 data.frame 中的列范围
- django - 在 Django 中为模型字段生成随机字符串
- csv - 使用 ; 在文件中进行 ansible 查找 基于 2 个变量分隔
- c++ - C++ - 我想将来自字符串向量指针的数据组合成以下格式的静态字符串向量
- mysql - 远程运行存储过程时,MySQL 抛出“拒绝用户执行命令”
- azure - Azure 资源 WebApp 已部署,但无法从 url 访问
- c# - 定位报告项目,没有与顶部的硬编码距离
- azure - Is there a way to setup a Snowpipe on multiple Azure Storage Accounts?
- python - 程序周二不工作,但周日工作
- terraform - 有没有办法按最旧而不是最新对 aws_ami 进行排序?