Xamarin.Список обновлений форм с другой страницы - PullRequest
0 голосов
/ 09 октября 2018

У меня есть две страницы ... Главная страница содержит представление списка и кнопку, которая открывает страницу (вторую страницу) для вставки в sq lite.поэтому у меня есть метод load (), который получает данные из базы данных sq lite и загружает их в список.я вызываю этот метод в конструкторе главной страницы, а также на второй странице после каждой вставки.

метод загрузки на главной странице

public void load_Records()
        {

            ObservableCollection<MyChickenModal> chickens_record;
            using (var db = new DataAccess())
            {
                chickens_record = new ObservableCollection<MyChickenModal>(db.GetAllData());

            }
            DisplayAlert("Alert", chickens_record.Count.ToString(), "OK");

            record_lst.ItemsSource = chickens_record;

        }

и вторая страница

public partial class NewChicksPopUp : Rg.Plugins.Popup.Pages.PopupPage
    {

        public DateTime selected_date = DateTime.Today.Date;
        MainPage mainP;

        public NewChicksPopUp (MainPage mainP)
        {
            InitializeComponent ();
            this.mainP = mainP;
        }

        private void chickenSubmit_btn_Clicked(object o, EventArgs e)
        {

            string record_name = record_name_txt.Text;

            using (var db = new DataAccess())
            {
                if (!string.IsNullOrEmpty(record_name) && !string.IsNullOrWhiteSpace(record_name) && selected_date!=null)
                {

                    db.InsertChicken(new MyChickenModal { Id = 1, Name = record_name, Age = 0, Weight = 0, StartDate = selected_date.ToString("dd/MM/yyyy") });

                }
            }

//************ HERE I CALL THE LOAD METHOD FROM MAIN PAGE********
            mainP.load_Records();

            PopupNavigation.Instance.PopAsync(true);

        }

        private void closePop_btn_Clicked(object o, EventArgs e)
        {

            PopupNavigation.Instance.PopAsync(true);

        }

        private void record_date_picker_DateSelected(object sender , DateChangedEventArgs e)
        {
            selected_date = e.NewDate.Date;
        }



    }

Проблема в том, что метод load отлично работает в конструкторе и загружает данные в представление списка .... Когда я вызываю метод load с другой страницы после вставки, метод работает нормально, так как появляется предупреждающее сообщение, но список не изменяется привсе.примечание: вставка в порядке, так как при запуске приложения появляется новая запись

1 Ответ

0 голосов
/ 09 октября 2018

попробуйте это:

public void load_Records()
{
    ObservableCollection<MyChickenModal> chickens_record;
    using (var db = new DataAccess())
    {
        chickens_record = new ObservableCollection<MyChickenModal>(db.GetAllData());

    }
    DisplayAlert("Alert", chickens_record.Count.ToString(), "OK");

    // Setting the ItemsSource to null will refresh the ListView
    record_lst.ItemsSource = null;

    record_lst.ItemsSource = chickens_record;

}

Это / был обходной путь, который добился цели в первые дни моно.Я не уверен, что это все еще работает, но стоит попробовать

MVVM-способ

Как я уже упоминал, сделайте это способом MVVM.Добавьте новый класс с именем xxxViewModel:

public class YourPageViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };


    private ObservableCollection<MyChickenModal> _chicken;
    public ObservableCollection<MyChickenModal> Chicken
    {
        get => _chicken;
        set
        {
            _chicken = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(Chicken)));
        }
    }

    public void LoadRecords()
    {
        var collection = new ObservableCollection<MyChickenModal>();

        using (var db = new DataAccess())
        {
            var allData = db.GetAllData();
            collection = new ObservableCollection<MyChickenModal>(allData);

        }
        DisplayAlert("Alert", chickens_record.Count.ToString(), "OK");

        Chicken = collection;
    }
}

Ваш код Xaml-кода:

public partial class YourPage
{
    public YourPage ()
    {
        InitializeComponent ();

        // Set the ViewModel
        this.BindingContext = new YourPageViewModel();
    }
}

И в вашем Xaml вы делаете это:

<ListView ... ItemsSource="{Binding Chicken}" .../>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...