C# 检测到二维码时如何更新ListView?

C# 检测到二维码时如何更新ListView?,c#,xamarin,C#,Xamarin,我正在尝试在ListView中显示具有QR码确切名称的项目。我正在使用ZXing,该列表显示在网站上反序列化JSON文件的过程中。处理二维码结果的矿山代码为: public void Handle_OnScanResult(Result result) { string wynik = result.Text; ItemPage P = new ItemPage(); Application.Current.MainPage.Navigation.PopModalAsy

我正在尝试在ListView中显示具有QR码确切名称的项目。我正在使用ZXing,该列表显示在网站上反序列化JSON文件的过程中。处理二维码结果的矿山代码为:

public void Handle_OnScanResult(Result result)
{

    string wynik = result.Text;
    ItemPage P = new ItemPage();
    Application.Current.MainPage.Navigation.PopModalAsync();
    P.Receive_result(wynik);

}
它正在获取结果。文本为wynik,使用摄像头关闭窗口并将其发送到以下代码:

public void Receive_result(string wynik)
{
    ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Equals(wynik));
}
当它读取二维码时,存储并发送值以接收结果,但它不会更新列表。 下面是负责显示ListView和反序列化对象的完整代码:

using System.ComponentModel;
using Xamarin.Forms;
using Diabetics.Models;
using System.Linq;
using System.Collections.ObjectModel;
using System.Net.Http;
using Newtonsoft.Json;
using System;

namespace Diabetics.Views
{
    [DesignTimeVisible(false)]
    public partial class ItemPage : ContentPage
    {
        public ObservableCollection<Item> itemlist = new ObservableCollection<Item>();
        public ItemPage()
        {
            InitializeComponent();
            LoadAll();

            ItemsListView.RefreshCommand = new Command(() => {
                LoadAll();
                ItemsListView.IsRefreshing = false;
            });

        }
//code to receive value wynik and update list
        public void Receive_result(string wynik)
        {
                ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Equals(wynik));

        }
//searchbar
        public void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(e.NewTextValue))
            {
                ItemsListView.ItemsSource = itemlist;
            }
            else
            {
                ItemsListView.ItemsSource = itemlist.Where(x => x.Nazwa.Contains(e.NewTextValue));
            }
        }
//On click to show item details
        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));

            ItemsListView.SelectedItem = null;
        }
//Button to show camera
        private async void ToolbarItem_ClickedAsync(object sender, EventArgs e)
        {
            await Navigation.PushModalAsync(new FullScreenScanning());
        }

//Json Deserialization
        public async void LoadAll()
        {
            waitActivityIndicator.IsRunning = true;
            waitActivityIndicator.IsVisible = true;
            string result = string.Empty;
            try
            {
                HttpClient Klient = new HttpClient();
                Klient.BaseAddress = new Uri("https://next.json-generator.com");
                string url = string.Format("/api/json/get/4yvwrz2bd");
                var response = await Klient.GetAsync(url);
                result = response.Content.ReadAsStringAsync().Result;

            }
            catch (Exception ex)
            {
                await DisplayAlert("Error", string.Format("Musisz być podłączony do internetu", ex.Message), "OK");
                waitActivityIndicator.IsRunning = false;
                waitActivityIndicator.IsVisible = false;
            }
            waitActivityIndicator.IsRunning = false;
            waitActivityIndicator.IsVisible = false;
            itemlist = JsonConvert.DeserializeObject<ObservableCollection<Item>>(result);
            ItemsListView.ItemsSource = itemlist;
        }
    } 
}
使用System.ComponentModel;
使用Xamarin.Forms;
使用糖尿病患者。模型;
使用System.Linq;
使用System.Collections.ObjectModel;
使用System.Net.Http;
使用Newtonsoft.Json;
使用制度;
名称空间糖尿病患者。视图
{
[设计时间可见(错误)]
公共部分类ItemPage:ContentPage
{
public ObservableCollection itemlist=新的ObservableCollection();
公共项目页()
{
初始化组件();
LoadAll();
ItemsListView.RefreshCommand=新命令(()=>{
LoadAll();
ItemsListView.IsRefreshing=false;
});
}
//接收值wynik和更新列表的代码
公共无效接收结果(字符串wynik)
{
ItemsListView.ItemsSource=itemlist.Where(x=>x.Nazwa.Equals(wynik));
}
//搜索栏
public void SearchBar_TextChanged(对象发送者,textchangedventargs e)
{
if(string.IsNullOrWhiteSpace(e.NewTextValue))
{
ItemsListView.ItemsSource=itemlist;
}
其他的
{
ItemsListView.ItemsSource=itemlist.Where(x=>x.Nazwa.Contains(e.NewTextValue));
}
}
//单击以显示项目详细信息
已选择异步(对象发送方,SelectedItemChangedEventArgs args)
{
如果(!(args.SelectedItem为项目))
返回;
等待Navigation.PushAsync(新的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));
ItemsListView.SelectedItem=null;
}
//显示照相机的按钮
私有异步无效工具栏项\u ClickedAsync(对象发送方,事件参数e)
{
等待导航。PushModalAsync(新的全屏扫描());
}
//Json反序列化
公共异步void LoadAll()
{
waitActivityIndicator.IsRunning=true;
waitActivityIndicator.IsVisible=true;
字符串结果=string.Empty;
尝试
{
HttpClient Klient=新的HttpClient();
Klient.BaseAddress=新Uri(“https://next.json-generator.com");
stringurl=string.Format(“/api/json/get/4yvwrz2bd”);
var response=await Klient.GetAsync(url);
结果=response.Content.ReadAsStringAsync().result;
}
捕获(例外情况除外)
{
等待显示警报(“错误”,string.Format(“Musisz byćpodłączony do internetu”,ex.Message),“OK”);
waitActivityIndicator.IsRunning=false;
waitActivityIndicator.IsVisible=false;
}
waitActivityIndicator.IsRunning=false;
waitActivityIndicator.IsVisible=false;
itemlist=JsonConvert.DeserializeObject(结果);
ItemsListView.ItemsSource=itemlist;
}
} 
}
是实现这一点的理想方法,但您也可以将引用传递到父页面

await Navigation.PushModalAsync(new FullScreenScanning(this));
在构造函数中,存储引用

ItemPage Parent;

public FullScreenScanning(ItemsPage parent)
{
  this.Parent = parent;
}
然后


您是否调试了
Receive\u result
以验证它是否正在接收数据,以及LINQ查询是否实际返回结果?你试过在UI线程上执行代码吗?@Jason它正在接收数据,但正如我看到的,LINQ query没有返回任何内容,我如何在UI线程上执行它?如果查询不起作用,那就是你的问题。修正firstitemlist count=0,但“wynik”的确切值为QR码,listview中有一个项目看起来是这样的,您的扫描页面如何调用
Receive_result
?当你调用
FullScreenScan
时,你似乎没有传递对页面的引用。我这样做了,它说当前上下文中不存在父对象。你是否将其命名为“父对象”或“父对象”?我尝试了“父对象”,但它甚至没有关闭FullScreenScan,它只是在调试窗口告诉我BarcodeFoundI不能在调试的每一步都握住你的手。它在执行Pop吗?ItemsPage是否收到代码?也许先打电话给Pop,然后再收到结果。我很抱歉。我在收到结果之前就有过,我认为这是错误的。谢谢它的工作,但我需要点击屏幕上的某个地方刷新它,有办法自动显示这个项目吗?
public void Handle_OnScanResult(Result result)
{
   string wynik = result.Text;
   Parent.Receive_result(wynik);
   Application.Current.MainPage.Navigation.PopModalAsync();
}