2
votes

Comment actualiser ou rappeler la page sur les formulaires Xamarin

Donc, j'ai cette application où je peux choisir une voiture et voir les informations sur la voiture ... J'affiche les voitures comme this .

J'utilise le Rg.Plugins.Popup donc quand je clique sur l'icône de la voiture, il ouvre ce popup avec" my cars "

Alors maintenant, je suis confronté à un problème qui est, lorsque je choisis une voiture, je veux actualiser ma page actuelle afin que les informations de la voiture puissent être affichées ... cliquez sur ce modèle de vue suivant:

public partial class CarDetails : BaseMainPage
        {

            public CarDetails(CarInfo car)
            {
                InitializeComponent();
                BindingContext = new CarDetailViewModel(this);
                App.currentPage = this;
                if (car != null)
                {
                    this.Title = "Dados de " + car.MakerandModel;
                }
                else
                {
                    this.Title = "Escolha uma Viatura";
                }
            }

        }

Et je veux que cette vue se rafraîchisse

<views:BaseMainPage 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="OficinaDigitalX.Views.CarDetails"
    xmlns:views="clr-namespace:OficinaDigitalX.Views">
    <views:BaseMainPage.Content>
        <StackLayout>
            <Label Text="{Binding VID, StringFormat='Modelo: {0:F0}'}" FontAttributes="Bold"
               FontSize="Large"/>
            <Label Text="{Binding LicencePlate, StringFormat='Matrícula: {0:F0}'}"/>
            <Label Text="{Binding Chassis, StringFormat='Chassis: {0:F0}'}"/>
            <Label Text="{Binding Km, StringFormat='Ultimos Km Registados: {0:N0}'}"/>
        </StackLayout>
    </views:BaseMainPage.Content>
</views:BaseMainPage>

et xaml.cs p>

public class MyCarViewModel : ViewModelBase
    {

        public MyCarViewModel()
        {
        }
        public MyCarViewModel(INavigation navigation)
        {
            this.Navigation = navigation;
            this.SelectedCar = null;
            GetClientCars();
        }

        private Page page { get; set; }
        private List<CarInfo> _CarList;

        public List<CarInfo> CarList
        {
            get
            {
                return _CarList;
            }

            set
            {
                _CarList = value;
                OnPropertyChanged("CarList");
            }
        }

        private CarInfo _SelectedCar;

        public CarInfo SelectedCar
        {
            get
            {
                return _SelectedCar;
            }

            set
            {
                _SelectedCar = value;
                OnPropertyChanged("SelectedCar");
                if (_SelectedCar != null)
                {
                    CarSelected(_SelectedCar);
                }

            }
        }

        public INavigation Navigation { get; set; }

        private void CarSelected(CarInfo car)
        {

            App.choosedCar = car;
            PopupNavigation.Instance.PopAllAsync();
            this.SelectedCar = null;
        }
}

Je rencontre beaucoup de problèmes ici car l'icône de ma voiture fait partie de ma "BaseMainPage" qui est étendue par les autres vues (ainsi l'icône peut être affichée sur tous vues) ...

Donc, lorsque je clique sur le bouton, l'application ne connaît pas sa page actuelle ... J'ai pensé que je pourrais utiliser la pile de navigation pour la recharger mais je ne sais pas trop comment faire cela ... J'espère que vous pourrez aider


6 commentaires

Utilisez-vous des frameworks MVVM?


oui, c'est ma classe publique MyCarViewModel: ViewModelBase


Puis-je voir comment vous naviguez entre les pages?


lorsque je clique sur mon bouton, cela se produit: PopupNavigation.Instance.PushAsync (new CarPopup ()); Ma fenêtre contextuelle de voiture est une vue liée à MyCarViewModel et, comme vous pouvez le voir sur une image, est un cadre qui a une disposition de pile avec ma liste de voitures à l'intérieur, lorsque je clique dans une voiture, My App.choosedcar obtient la valeur de la nouvelle voiture. .mais la page qui est à l'arrière reste toujours là (voir aussi sur l'image) et dans cette page j'ai une liaison à un choosedCar qui dans le constructeur est égal à App.choosedcar Donc j'utilise App.choosedCar comme variable globale donc je peux l'utiliser partout sans perdre la voiture choisie


Pourquoi définir cela comme contexte de liaison de la page alors?


désolé de l'avoir corrigé, j'utilise maintenant un modèle de vue


3 Réponses :


1
votes

Je pense que vous n'avez pas besoin de recharger la page, vous devez recharger vos données. Votre page sera mise à jour automatiquement avec les liaisons de données.

Pour moi, il semble que vous utilisez Prism, vous pouvez donc remplacer la méthode OnNavigatingTo et charger les données à chaque fois que la page est "ouverte".


10 commentaires

le truc, c'est que lorsque je clique sur le bouton de ma voiture, cela ouvre une fenêtre contextuelle pour que la page ne change pas et qu'elle ne sache pas que la fenêtre contextuelle est ouverte ... donc je ne sais pas comment envoyer un message "du popup à ma page puisque j'ai le popup dans toutes mes pages ... j'ai pensé envoyer peut-être la navigation mais ce n'est pas si simple ...


Comment fermez-vous votre popup? Utilisez-vous INavigationService.GoBackAsync () ou naviguez-vous à nouveau vers votre page en utilisant NavigateAsync ()?


J'utilise une propriété de mon plugin Rg.Plugins.Popup, il attend PopupNavigation.Instance.PopAllAsync ();


Ai-je vu correctement que vous utilisez Prism Framework pour MVVM?


Je suis un peu noob dans xamarin xD C'est mon premier projet, mais je suppose que je n'utilise pas Prism ... xb


Est-il possible que vous fournissiez un projet?


Je pourrais en fournir une partie, mais j'obtiens les données de la base de données pour que vous ne puissiez rien voir ...


Peu importe, il serait beaucoup plus facile de vous aider à regarder votre code.


Je pense que j'ai oublié d'inclure les images dans le projet xD si elles n'apparaissent pas, ajoutez-les simplement, elles sont sur le dessin


Semble que le fichier RAR est endommagé



3
votes

Eh bien, essentiellement, vous n'avez pas besoin d'actualiser la page ou de recharger la page, il vous suffit d'actualiser les données.

puisque vous utilisez OnPropertyChanged (INotifyPropertyChanged), vous êtes à mi-chemin. au lieu d'utiliser List CarList , utilisez ObservableCollection CarList.

et si vous souhaitez volontairement recharger la page, en rejetant le pop.up, enregistrez vos données et appelez le constructeur / relancez la page.

j'espère que vous devriez réaliser ce que vous recherchez.


6 commentaires

merci mais je ne peux pas (ou je ne sais pas) recharger la page parce que je ne sais pas dans quelle page je suis ... C'est comme, je sais mais l'application n'a pas xD vous pouvez voir J'utilise BaseMainPage qui est une page de contenu avec un bouton (le bouton de ma voiture) et je l'implémente dans toutes mes pages afin que je puisse avoir ce bouton dans chacune d'elles et le gérer de la même manière au lieu de réécrire le code à chaque fois. .. Alors que je clique sur ce bouton, je n'envoie aucune information sur l'endroit où je me trouve pour le moment ...


Donc, ce que j'ai essayé était de créer une variable globale sur mon App.xaml.cs et d'enregistrer la page actuelle là-bas, mais je ne peux pas ouvrir une page à partir d'une chaîne ... ou même si je l'enregistre en tant que page, je peux ne pas faire une "nouvelle" navigation à partir d'une variable ... J'enregistre ma voiture sélectionnée dans une variable comme celle-ci et j'utilise dans ma liaison comme ce void privé CarSelected (CarInfo car) {App.choosedCar = car; }


Laissez-moi essayer de comprendre à nouveau votre problème. SUR LA PAGE POPUP, lorsque l'utilisateur clique sur un modèle de voiture, vous souhaitez masquer la liste et afficher les détails de cette voiture.?


J'ai une page (toutes mes pages implémentent la page principale qui a l'icône de voiture) et je clique sur l'icône, et une fenêtre contextuelle avec ma liste de voitures s'affiche (ma page est toujours ouverte au verso) Je choisis une voiture et ma variable globale App.choosedcar est réglé sur la valeur de la nouvelle voiture et la fenêtre contextuelle se ferme, mais comme la page est ouverte, elle n'actualise pas le contenu et puisque j'économise sur ma variable globale (je peux donc l'utiliser également sur toutes les pages et savoir quelle voiture est sélectionnée) Je ne peux pas avoir la méthode "onpropertychanged" :(


la variable que j'utilise pour obtenir la voiture sur le modèle de vue est définie sur le constructeur


Merci ça marche pour moi



1
votes

Je viens d'utiliser MessagingCenter et je l'ai appelé avec mon OnPropertyChanged et cela semble faire le travail! Merci beaucoup!

Modèle de vue:

MessagingCenter.Subscribe<MyCarViewModel>(this, "Hi", (sender) => {
                this.currentCar = App.choosedCar;
            });

Le constructeur de mon autre modèle de vue

OnPropertyChanged("SelectedCar");
                if (_SelectedCar != null)
                {
                    CarSelected(_SelectedCar);
                    MessagingCenter.Send(this, "Hi");
                }


0 commentaires