Обновить страницу новыми данными из APi с помощью searchHandler Xamarin C#

У меня вопрос по обработчику поиска функции в xamarin. Я только начинаю изучать xamarin и пытаюсь в своем проекте с обработчиком поиска в xamarin обновить свою страницу новыми данными из API. В настоящее время мне уже повезло получить данные, но когда я это делаю, он создает, так сказать, новую страницу, а это не то, что я хочу. Он как бы перезагружал страницу новыми данными. Я также уже пытался удалить предыдущую страницу с помощью «Shell.Current.Navigation.PopAsync();» Но без остаточного результата. Кто-нибудь знает, как я могу добиться того, чего хочу? Кроме того, я также хотел бы удалить то размытие, которое вы получаете после поиска. Заранее спасибо!

using Eindproject.Models;
using Eindproject.Repository;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Eindproject.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Weather : ContentPage
    {
        private string icao = "EBBR";


        public Weather()
        {
            InitializeComponent();
        }

        public Weather(string icao)
        {
            InitializeComponent();
            this.icao = icao;
            frontend(icao);
        }

        public async void frontend(string par_icao)
        {
            // Get weather
            Models.WeatherModel weather = await DataRepository.GetWeatherAsync(par_icao);
            // Set data to labels
            lblLocation.Text = weather.Station.Name;
            lblCode.Text = weather.Code;
            lblTemp.Text = weather.Temperature.C.ToString();
            lblHumidity.Text = weather.Humidity.Percent.ToString();
            lblWind.Text = weather.Wind.Degrees.ToString();
            lblPressure.Text = weather.Presure.Hpa.ToString();
            lblDate.Text = weather.Date.ToString("G");
            lblMetar.Text = weather.Metar;
            lblCloud.Text = weather.Clouds[0].text;

            // Get sunrise and sunset
            SunTimes sunrise = await DataRepository.GetSunTimesAsync("EHBK");

            // Set data to labels
            lblSunrise.Text = sunrise.Sunrise.ToString("G");
            lblSunset.Text = sunrise.Sunset.ToString("G");

        }

        private void ToolbarItem_Clicked(object sender, EventArgs e)
        {

        }

    }

    public class CustomSearchHandler : SearchHandler
    {
        // When user press enter and confirm get the icao code and search for the weather
        protected override void OnQueryConfirmed()
        {
            // Get the icao code
            string icao = Query;

            // Call wheather object
            Weather weather = new Weather();

            // Call frontend
            weather.frontend(icao);

        }
    }

}

вам нужно обновить свою страницу вместо перехода к новому экземпляру страницы

Jason 21.11.2022 15:27

если вам нужен более конкретный совет, пожалуйста, отредактируйте свой вопрос, чтобы включить код, который показывает, как вы загружаете свои данные в первый раз

Jason 21.11.2022 16:01

@Jason Джейсон, я обновил вопрос, указав, где я загружаю данные в первый раз.

Bartballon 21.11.2022 16:19

ваш метод frontend выполняет всю необходимую работу, поэтому вы просто сможете снова вызвать его из обработчика поиска.

Jason 21.11.2022 16:21

@ Джейсон Я только что попробовал это, но, похоже, это не работает. Я дублировал, и он появляется в функции внешнего интерфейса, но он не заполняет никаких данных. Я получаю этот размытый экран, но без обновленных данных.

Bartballon 21.11.2022 16:42
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

это создает новый экземпляр Weather и вызывает его метод frontend. Ничего полезного от этого не будет.

Weather weather = new Weather();
weather.frontend(icao);

Вместо этого вам нужно использовать существующий экземпляр, который уже отображается пользователю.

есть много способов сделать это, но это может быть самый простой

// get the current page
var page = App.Current.MainPage;
// cast it to the correct type
var weather = (Weather)page;
// call its frontend method
page.frontend(icao);

Я только что попробовал это, и я получаю сообщение об ошибке System.InvalidCastException: 'Specified cast is not valid.' на слепке страницы. Страница типа {xxx.AppShell} есть идеи, как мне это исправить?

Bartballon 21.11.2022 18:28

если вы используете Shell, см. stackoverflow.com/questions/57803149/…

Jason 21.11.2022 18:32

Другие вопросы по теме