0
votes

Comment accéder à un ListView à partir d'une autre page? (Xamarin Forms)

Je souhaite modifier le contenu d'une vue de liste depuis ma page principale. La vue de liste se trouve dans une autre page appelée LoadResultsPage. Voici le bouton de la page principale qui appelle la fonction:

<?xml version="1.0" encoding="utf-8" ?>
  <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Calculator.Views.LoadResultsPage">
<Grid  VerticalOptions="FillAndExpand">
    <ListView x:Name="Lista" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell >
                    <StackLayout >
                        <Label Text="{Binding Id}" TextColor="Black"></Label>
                        <Label Text="{Binding Value}"></Label>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

Voici la fonction qui s'appelle:

public async void FetchData(object sender, System.EventArgs e)
    {
        /* string apiUrl = null;
         if (Device.RuntimePlatform == Device.Android)
             apiUrl = "https://10.0.2.2:5001/api";
         else if (Device.RuntimePlatform == Device.iOS)
             apiUrl = "https://localhost:5001/api";
         else
             throw new Exception();*/
        await Navigation.PushAsync(new LoadResultsPage());
        var httpClient = new HttpClient();
        var response = await httpClient.GetStringAsync("http://localhost:5001/api/Calcs");
        var login = JsonConvert.DeserializeObject<List<Calc>>(response);
        Lista.ItemsSource = login;
    }

Ici Lista (en bas de la fonction) n'est pas reconnu et l'erreur est: "Le nom 'Lista' n'existe pas dans le contexte actuel"

Et enfin voici le contenu de la page LoadResultsPage où la vue de liste que je veux modifier est:

<Button Text="Load Results" Clicked="FetchData"></Button>

Comment remplir les deux étiquettes avec les informations de la variable "login" em>?


1 commentaires

pourquoi ne passez-vous pas simplement les résultats de l'appel à LoadResultsPage via le constructeur? Ou pourquoi LoadResultsPage ne peut-il pas simplement appeler l'API elle-même?


3 Réponses :


0
votes

Le champ de nom n'est pas une propriété publique, il n'est donc pas accessible par défaut en dehors de la page.

Il y a deux options pour votre question:

  1. Une fois que vous avez obtenu les données (dans votre cas "login"), alors seulement vous accédez à LoadResultsPage et passez le login comme paramètre et dans LoadResultsPage, vous aurez accès à "Lista".

  2. Créez une propriété publique dans LoadResultsPage, après avoir obtenu "login", attribuez "login" à cette propriété et dans LoadResultsPage, définissez Lista.ItemSource sur cette propriété.


0 commentaires

1
votes

Veuillez lire à propos de MVVM que je change votre concept globalement. L'accès aux éléments d'interface utilisateur entre les pages n'est pas considéré comme le meilleur style.

Quoi qu'il en soit, pour répondre directement à votre question, utilisez un modèle statique pour échanger des données globalement à l'intérieur de l'application.

        Device.BeginInvokeOnMainThread(() =>
        {
            // Update the UI
            Exchange.Data.MyListView.ItemsSource = whatever;
        });

Exemple: Exchange.Data.Buffer sera accessible de n'importe où.

Pour votre ListView dans sa page constuctor après le InitializeComponent (); set

Exchange.Data.MyListView = Lista;

Maintenant, la partie importante est que si vous accédez à votre ListView depuis une autre page, vous devez le faire sur le fil de l'interface utilisateur. Exemple:

    public class Exchange
    {
        private static Exchange _instance;
        public static Exchange Data
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Exchange();
                }
                return _instance;
            }
        }

        public string Buffer { get; set; }

        public ListView MyListView { get; set; }

    }


0 commentaires

0
votes

Ici, suggérant que la transmission de données de connexion pour LoadResultsPage , puisse ensuite afficher les données lorsque LoadResultsPage apparaît.

p> Par exemple, en modifiant la méthode FetchData comme suit:

public partial class DetailPage : ContentPage
{
    public DetailPage(Model login)
    {
        InitializeComponent();
        Lista.ItemsSource = login;
    }
}

Puis dans LoadResultsPage.xaml.cs : p>

public async void FetchData(object sender, System.EventArgs e)
{
    
    var httpClient = new HttpClient();
    var response = await httpClient.GetStringAsync("http://localhost:5001/api/Calcs");
    var login = JsonConvert.DeserializeObject<List<Calc>>(response);
    //Lista.ItemsSource = login;

    await Navigation.PushAsync(new LoadResultsPage(login));
}


0 commentaires