2016-01-25 4 views
1

В настоящее время я создаю приложение UWP с XAML и C#, но я попал в серьезную проблему. Домашняя страница содержит более 700 элементов, которые хранятся в базе данных SQLite и заполняются во время выполнения. Каждый раз, когда я перемещаюсь и возвращаюсь на страницу, приложение замерзает на некоторое время, а затем отображает домашнюю страницу ... Как я могу заполнить ее только один раз, даже если она занимает все мое время запуска?Заполнение GridView с привязкой данных только один раз за выполнение

Мой код для заполнения выглядит следующим образом (в * .xaml.cs):

public sealed partial class MainView : Page 
{ 
    // Creates the Collection 
    public System.Collections.ObjectModel.ObservableCollection<sqlitetable> chooseaname = new System.Collections.ObjectModel.ObservableCollection<sqlitetable>(); 

    public MainView() 
    { 
     this.InitializeComponent(); 

     // Populates the Collection 
     using (var db = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), System.IO.Path.Combine(Windows.ApplicationModel.Package.Current.InstalledLocation.Path, "Assets", "database.db"))) 
     { 
      foreach (var entry in db.Table<sqlitetable>()) 
      { 
       chooseaname.Add(new sqlitetable { Image = "/Assets/pics/" + entry.ID + ".png", Name = entry.Name, Type1 = "/Assets/Types/" + entry.Type1 + ".png", Type2 = "/Assets/Types/" + entry.Type2 + ".png", dummyID = "# " + entry.ID.ToString("000") }); 
      } 
     } 

     // Sets the binding 
     mainView.ItemsSource = chooseaname; 
    } 
+0

Что делает ваш код выглядеть? В упрощенной форме? –

+0

Что вы «заселяетесь»? Если элементы идут непосредственно на страницу, вы будете почти * иметь *, чтобы заполнять ее каждый раз. Если они собираются в какую-то другую коллекцию, это достаточно легко. –

+0

@PetterHesselberg Сделано, но я не думаю, что способ, которым я это делаю, будет проходить через изменения для заполнения только один раз. –

ответ

0

Вот быстрый и грязный подход к загрузке данных только один раз:

public sealed partial class MainView : Page 
{ 
    private static IList<sqlitetable> data = null; 

    public IList<sqlitetable> Data 
    { 
     get 
     { 
      if (data == null) 
      { 
       data = new List<sqlitetable>(); 

       // Populates the Collection 
       using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), Path.Combine(Package.Current.InstalledLocation.Path, "Assets", "database.db"))) 
       { 
        foreach (var entry in db.Table<sqlitetable>()) 
        { 
         data.Add(new sqlitetable { Image = "/Assets/pics/" + entry.ID + ".png", Name = entry.Name, Type1 = "/Assets/Types/" + entry.Type1 + ".png", Type2 = "/Assets/Types/" + entry.Type2 + ".png", dummyID = "# " + entry.ID.ToString("000") }); 
        } 
       } 
      } 

      return data; 
     } 
    } 

    public MainView() 
    { 
     this.InitializeComponent(); 
     gridView.ItemsSource = Data; 
    } 
} 

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

Также рассмотрим связывание с вашими данными из XAML вместо установки ItemsSource в коде, например .:

<GridView ItemsSource="{x:Bind Data, Mode=OneTime}" /> 
+0

В 'data.Add (...)', я получаю «Ссылка на объект не установлена ​​в экземпляр объекта». –

+0

Ах. Виноват; Я обновлю ответ. –

+0

Я нашел что-то еще: 'data'' readonly', поэтому его нельзя назначить в методе 'get'. Я отредактирую ваш ответ. –

Смежные вопросы