Загрузка ListView асинхронно - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь загрузить свой список с данными из моей базы данных.И данные будут периодически обновляться.

<ListView Margin="10" Name="lvDataBinding" ></ListView> //frontend

Сейчас я экспериментирую с использованием backgroundworker для загрузки новых данных, но мне не повезло

     <ListView Margin="10" Name="lvDataBinding" ></ListView> //frontend

    ObservableCollection<string> mNames = new ObservableCollection<string>(); 


public SettingsControl()
            {
                InitializeComponent();

                listview1.ItemsSource = mNames;
                mNames.Add("1");
                var mWorker = new BackgroundWorker();
                mWorker.DoWork += Worker_ListenForNewSMS;
                mWorker.RunWorkerAsync();


        }

    private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
            {
                while (true)
                {
                    Thread.Sleep(2000);
                    //fetch and load new data here, cant seems to work
                   listview1.ItemsSource = "NEWDATA";


                }
            }

Так как же он мог перезагрузить данныеасинхронно, я не хочу обновлять страницу.

Мне нужно, чтобы она была в цикле, чтобы я мог слушать базу данных и, если есть новая запись, она обновит список

Я осознаю, что данные ослепляют, но у меня очень мало опыта в этом, кто-нибудь может привести пример, который мне в этом поможет.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Добавьте новые данные в исходную коллекцию с помощью диспетчера:

private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        Thread.Sleep(2000);
        Dispatcher.BeginInvoke(new Action(() =>
        {
            mNames.Add("NEWDATA");
        }));
    }
}

Диспетчер выполняет обратный вызов в потоке пользовательского интерфейса.Это необходимо, поскольку вы можете обновить только привязанную к данным коллекцию в потоке пользовательского интерфейса (если только вы не используете метод BindingOperations.EnableCollectionSynchronization ).

Вам также нужно использовать диспетчер, если вы длянекоторые причины переустанавливают свойство ItemsSource:

private void Worker_ListenForNewSMS(object sender, DoWorkEventArgs e)
{
    while (true)
    {
        Thread.Sleep(2000);
        Dispatcher.BeginInvoke(new Action(() =>
        {
            listview1.ItemsSource = new List<string> { "NEWDATA" };
        }));
    }
}

Вы не можете установить свойство элемента управления пользовательского интерфейса из фонового потока.

0 голосов
/ 21 мая 2018

В конце я загружаю просмотр списка с помощью observableCollection

и использую кнопку для запуска функции обновления

0 голосов
/ 21 мая 2018

С тех пор ItemsSource из ListView уже настроен, поэтому лучший способ обновить данные, используя следующий код:

mNames.Clear();
// Now add the ite,
mNames.Add("item1");
mNames.Add("item2");

Дополнительное значение

Вы реализуете метод AddRange наObservableCollection, так что выше несколько оценок могут быть преобразованы в mNames.AddRange(<Collection Object>).Перейдите по этой ссылке для реализации AddRange.

// Альтернативное решение

Если вы попытаетесь обновить ItemsSource, вам следует обновить представление вручную.Предположим, вам нужно обновить его ОДИН раз после того, как ВСЕ элементы были добавлены в ItemsSource), поэтому вы должны использовать этот подход:

// Create the view.
ICollectionView view = CollectionViewSource.GetDefaultView(mNames);

// To Refresh calls like this.
view.Refresh();

Я бы предпочел с опцией 1.

...