扫描二维码时显示 Json 列表中的项目
Posted
技术标签:
【中文标题】扫描二维码时显示 Json 列表中的项目【英文标题】:Showing item from Json list while scanning QR code 【发布时间】:2020-05-22 22:20:05 【问题描述】:我有 JSON 格式的列表,我正在反序列化它。它看起来像这样:
[
"Nazwa": "Czekolada mleczna Sport & Fitness",
"Opis": "Przykładowy opis produktu Czekolada mleczna Sport & Fitness",
"Zdjecie": "https://www.friars.co.uk/images/lindt-gold-milk-chocolate-bar-p504-7263_image.jpg",
"WW": 0.28,
"WBT": 0.22,
"Energia": 31.8125,
"Tluszcz": 2.19375,
"Weglowodany": 3.225,
"Blonnik": 0.11875,
"Bialko": 0.45625,
"Zelazo": 0.1875,
"Wapn": 15.5,
"Code": "czokolate_1"
,
"Nazwa": "Czekolada mleczna Sport & Fitness2",
"Opis": "Przykładowy opis produktu Czekolada mleczna Sport & Fitness2",
"Zdjecie": "https://vaya.in/recipes/wp-content/uploads/2018/02/Milk-Chocolate-1.jpg",
"WW": 0.16,
"WBT": 0.21,
"Energia": 28.5625,
"Tluszcz": 2.19375,
"Weglowodany": 2.94375,
"Blonnik": 0.4875,
"Bialko": 0.34375,
"Zelazo": 0.8125,
"Wapn": 0,
"Code": "czokolate_2"
]
我正在使用ZXing.Net.Mobile.Forms扫描二维码。为了处理结果,我有这个代码:
public Item item get; set;
public void Handle_OnScanResult(Result result)
Device.BeginInvokeOnMainThread(async () =>
string code = item.Code;
string wynik = result.Text;
if (wynik == code)
await Navigation.PushAsync(new ItemDetailPage(item.Nazwa, item.Opis, item.Zdjecie, item.WW, item.WBT, item.Energia, item.Tluszcz, item.Weglowodany, item.Blonnik, item.Bialko, item.Zelazo, item.Wapn, item.Code));
await DisplayAlert("Wyszukaj?", item.Nazwa, "OK");
);
item.Code 是分配给 JSON 列表中项目的值,如果我使用 QR 码也有这个值
Device.BeginInvokeOnMainThread(async () =>
string wynik = result.Text;
await DisplayAlert("Wyszukaj?", wynik, "OK");
);
它显示了这个值“code”。我希望它显示包含所有值的详细信息页面(我有它,但只有当您单击列表中的项目时,它才会将此项目的所有值发送到 ItemDetailPage) 项目页面
async void OnItemSelected(object sender, SelectedItemChangedEventArgs args)
if (!(args.SelectedItem is Item item))
return;
await Navigation.PushAsync(new ItemDetailPage(item.Nazwa, item.Opis, item.Zdjecie, item.WW, item.WBT, item.Energia, item.Tluszcz, item.Weglowodany, item.Blonnik, item.Bialko, item.Zelazo, item.Wapn, item.Code));
// Manually deselect item.
ItemsListView.SelectedItem = null;
ItemDetailPage
public ItemDetailPage(string Nazwa, string Opis, string Zdjecie, float WW, float WBT, float Energia, float Tluszcz, float Weglowodany, float Blonnik, float Bialko, float Zelazo, float Wapn, string Code)
InitializeComponent();
tytul.Title = Nazwa;
nazwa.Text = Nazwa;
opis.Text = Opis;
foto.Source = ImageSource.FromUri(new Uri(Zdjecie));
ww_item.Text = WW.ToString();
wbt_item.Text = WBT.ToString();
energia_item.Text = Energia.ToString();
tluszcz_item.Text = Tluszcz.ToString();
weglowodany_item.Text = Weglowodany.ToString();
blonnik_item.Text = Blonnik.ToString();
bialko_item.Text = Bialko.ToString();
zelazo_item.Text = Zelazo.ToString();
wapn_item.Text = Wapn.ToString();
我希望它移动到 ItemDetailPage,其中包含与 QR 码具有相同“代码”值的项目详细信息 要么 我希望它仅显示具有“代码”值作为 QR 码的那些项目的 ItemPage。 我尝试使用类似搜索栏的东西,但无法使用 JSON 列表
【问题讨论】:
您是在问如何在列表中找到与扫描代码匹配的项目? @Jason 是的,这就是我的意思,对不起,如果我不够清楚 还会有一件商品匹配一个二维码 我建议您将项目传递给ItemDetailPage
,而不是详细属性。
@JackHua-MSFT 我试过这样做,但它对我不起作用,这就是我使用详细属性的原因
【参考方案1】:
从列表中选择单个项目(假设 items
是 List<Item>
)
using System.Linq;
var item = items.FirstOrDefault(x => x.Code == result.Text);
选择所有匹配项
var allitems = items.Where(x => x.Code == result.Text).ToList();
【讨论】:
我在 ItemDetailPage 中只有 Observablecollectionpublic ObservableCollection<Item> items get; set;
public void Handle_OnScanResult(Result result) Device.BeginInvokeOnMainThread(() => var item = items.FirstOrDefault(x => x.Code = result.Text); );
我有两个错误,我无法将字符串转换为布尔值,而这个错误:CS1662 C# Cannot convert lambda将表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
你为什么要这样做?这不是 UI 操作。它只是在您的列表中找到匹配的数据。然后,您可以将该数据传递到您的 UI 页面。还要检查“=”与“==”
好的,我有类似 public async void Handle_OnScanResult(Result result) var item = items.FirstOrDefault(x => x.Code == result.Text); await Navigation.PushAsync(new ItemPage());
的东西,但我不知道我应该将这些数据传递到哪里,到 ItemPage 或 ItemsViewModel?
ItemDetailPage,我假设以上是关于扫描二维码时显示 Json 列表中的项目的主要内容,如果未能解决你的问题,请参考以下文章
expo项目,无法通过扫描二维码将项目加载到iPhone,如何解决?