Обратный вызов ContentPage из слушателя событий вспомогательного класса - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть простой проект Xamarin Forms для тестирования взаимодействия с базой данных Firebase Realtime. Он включает в себя главную страницу с кнопками для добавления, редактирования, удаления и запроса базы данных. Вспомогательный класс Firebase содержит весь код для выполнения этих действий, а также наблюдаемую подписку для запуска события при добавлении, обновлении или удалении данных. Мне нужен метод «ShowData», вызываемый наблюдаемым событием, чтобы сделать обратный вызов ContentPage для обновления списка.

Я не уверен, как это сделать. Я думал, что смогу добавить метод делегата к ContentPage, но не знал, как его кодировать на странице.

Любая помощь очень ценится.

Класс помощника Firebase

using System;
using System.Collections.Generic;
using XamarinFirebase.Model;
using Firebase.Database;
using Firebase.Database.Query;
using System.Linq;
using System.Threading.Tasks;
using Firebase.Database.Streaming;
using Xamarin.Forms;

namespace XamarinFirebase.Helper
{

    public class FirebaseHelper
    {
        FirebaseClient firebase = new FirebaseClient("https://xamarinfirebase-bdc74.firebaseio.com/");
        bool init = false;
        int status = 0;

        public void ShowData(FirebaseEvent<Person> e)
        {
            try
            {
                switch (e.EventType)
                {
                    case FirebaseEventType.Delete:
                        if (status == 4)
                        {
                            Device.BeginInvokeOnMainThread(async () =>
                            {
                                await Application.Current.MainPage.DisplayAlert("Deleted", e.EventSource.GetType().ToString() + " - " + e.Object.Name, "OK");
                            });
                        }
                        break;
                    case FirebaseEventType.InsertOrUpdate:
                        if (status == 2)
                        {
                            Device.BeginInvokeOnMainThread(async () =>
                            {
                                await Application.Current.MainPage.DisplayAlert("Added", e.EventSource.GetType().ToString() + " - " + e.Object.Name, "OK");
                            });
                        }
                        if (status == 3)
                        {
                            Device.BeginInvokeOnMainThread(async () =>
                            {
                                await Application.Current.MainPage.DisplayAlert("Updated", e.EventSource.GetType().ToString() + " - " + e.Object.Name, "OK");
                            });
                        }
                        break;
                    default:
                        Device.BeginInvokeOnMainThread(async () =>
                        {
                            await Application.Current.MainPage.DisplayAlert("Unknown", e.EventSource.GetType().ToString() + " - " + e.Object.Name, "OK");
                        });
                        break;
                }

                status = 0;
            }
            catch (Exception)
            {

                throw;
            }
        }

        public async Task<List<Person>> GetAllPersons()
        {
            if (!init)
            {
                var observable = firebase
                    .Child("Persons")
                    .AsObservable<Person>()
                    .Subscribe(d => ShowData(d));

                init = true;
            }

            status = 1;

            return (await firebase
              .Child("Persons")
              .OnceAsync<Person>()).Select(item => new Person
              {
                  Name = item.Object.Name,
                  PersonId = item.Object.PersonId
              }).ToList();
        }

        public async Task<Person> GetPerson(int personId)
        {
            status = 1;

            var allPersons = await GetAllPersons();
            await firebase
              .Child("Persons")
              .OnceAsync<Person>();
            return allPersons.Where(a => a.PersonId == personId).FirstOrDefault();
        }

        public async Task AddPerson(int personId,string name)
        {
            status = 2;

            await firebase
              .Child("Persons")
              .PostAsync(new Person() { PersonId=personId, Name = name });
        }

        public async Task UpdatePerson(int personId, string name)
        {
            status = 3;

            var toUpdatePerson = (await firebase
              .Child("Persons")
              .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

            await firebase
              .Child("Persons")
              .Child(toUpdatePerson.Key)
              .PutAsync(new Person() { PersonId = personId, Name = name });
        }

        public async Task DeletePerson(int personId)
        {
            status = 4;

            var toDeletePerson = (await firebase
              .Child("Persons")
              .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();
            await firebase.Child("Persons").Child(toDeletePerson.Key).DeleteAsync();

        }
    }

}

ContentPage

using System;
using Xamarin.Forms;
using XamarinFirebase.Helper;

namespace XamarinFirebase
{
    public partial class MainPage : ContentPage
    {
        FirebaseHelper firebaseHelper = new FirebaseHelper();

        public MainPage()
        {
            InitializeComponent();
        }

        protected async override void OnAppearing()
        {

            base.OnAppearing();
            var allPersons = await firebaseHelper.GetAllPersons();
            lstPersons.ItemsSource = allPersons;
        }

        private async void BtnAdd_Clicked(object sender, EventArgs e)
        {
            try
            {
                await firebaseHelper.AddPerson(Convert.ToInt32(txtId.Text), txtName.Text);
                txtId.Text = string.Empty;
                txtName.Text = string.Empty;
                var allPersons = await firebaseHelper.GetAllPersons();
                lstPersons.ItemsSource = allPersons;
            }
            catch (Exception)
            {

                throw;
            }
        }

        private async void BtnRetrive_Clicked(object sender, EventArgs e)
        {
            try
            {
                var person = await firebaseHelper.GetPerson(Convert.ToInt32(txtId.Text));
                if (person != null)
                {
                    txtId.Text = person.PersonId.ToString();
                    txtName.Text = person.Name;

                }
                else
                {
                    await DisplayAlert("Success", "No Person Available", "OK");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        private async void BtnUpdate_Clicked(object sender, EventArgs e)
        {
            try
            {
                await firebaseHelper.UpdatePerson(Convert.ToInt32(txtId.Text), txtName.Text);
                txtId.Text = string.Empty;
                txtName.Text = string.Empty;
                var allPersons = await firebaseHelper.GetAllPersons();
                lstPersons.ItemsSource = allPersons;
            }
            catch (Exception)
            {

                throw;
            }
        }

        private async void BtnDelete_Clicked(object sender, EventArgs e)
        {
            try
            {
                await firebaseHelper.DeletePerson(Convert.ToInt32(txtId.Text));
                var allPersons = await firebaseHelper.GetAllPersons();
                lstPersons.ItemsSource = allPersons;
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}

1 Ответ

0 голосов
/ 04 апреля 2019

Центр сообщений Xamarin Forms может сделать это за вас

Подписаться на сообщение в вашем контенте. Страница:

MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) => {
// Your code here
});

Затем добавьте сообщение на страницу с содержимым, например:

MessagingCenter.Send<MainPage> (this, "Hi"); 

Строка не изменяется - она ​​указывает тип сообщения и используется для определения, каких подписчиков следует уведомлять. Сообщение такого рода используется для указания того, что произошло какое-то событие, например, «загрузка завершена», когда дополнительная информация не требуется.

ПРИМЕЧАНИЕ в обоих случаях this - это экземпляр MainPage.

Для лучшего понимания проверьте Центр сообщений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...