Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
1
WPF

Ошибка добавления в список ViewModel

14.01.2021, 13:21. Показов 706. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В моделе есть асинхронная задача, которая каждые n-секунд обновляет курс валют.
CurrencyExchangerModel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private async Task UpdateRates(int seconds)
        {
            while (true)
            {
                foreach (var item in AvalibleCurrency)
                {
                    var task = Task.Run(() => service.GetCurrencyRate(item.Key));
                    try
                    {
                        await task;
                        SetCurrencyValue(new CurrencyDto(item.Key, task.Result.Rate, task.Result.Name, item.Value));
                    }
                    catch (Exception ex)
                    {
                        throw new ArgumentException(ex.Message);
                    }
                }
                await Task.Delay(seconds * 1000);
            }
        }
В ViewModel я "прослушиваю" изменения в моделе.

CurrencyMainViewModel
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        //Сделал список асинхронным, ибо думал что проблема в этом. Но не помогло
        //если изменить на ObservableCollection, будет тоже самое. 
        private AsyncObservableCollection<ICurrencyViewModel> _currencyList;
        public AsyncObservableCollection<ICurrencyViewModel> CurrencyList { get => _currencyList; set => SetProperty(ref _currencyList, value); }
 
        public CurrencyMainViewModel(CurrencyExchangerModel model)
        {
            this.model = model;
            model.ChangedCurrencies += ActionListChanged;
        }
 
        private void ActionListChanged(object sender, NotifyDictionaryChangedEventArgs<string, CurrencyDto> e)
        {
            CurrencyList.Add(new CurrencyViewModel(e.NewValue));
        }
Изначально список у меня пуст, следовательно без проблем должно в него добавить значения. Но на строке CurrencyList.Add(new CurrencyViewModel(e.NewValue)); перекидывает в модель, в метод UpdateRates, где catch выдаёт следующий результат
"This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread."
Ошибка добавления в список ViewModel


С Task, async и await я только знакомлюсь.
Боюсь где-то что-то я напутал.

Если же я заполню список и попытаюсь его изменить, то изменения проходят успешно, а вот добавление -- не работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2021, 13:21
Ответы с готовыми решениями:

Ошибка добавления в односвязный список
Здравствуйте! Срочно помогите исправить ошибку в программе. Задача: Из бинарного дерево все...

Как из ViewModel UserControl'a изменить свойство в ViewModel главного окна?
Недавно начал попытки создавать приложение WPF с применением MVVM, и у меня возник вопрос, который...

WPF получить доступ из одной viewmodel к другой viewmodel
Собственно есть у меня две viewmodel, mainviewmodel и settingsviewmodel, в mainviewmodel есть вот...

Проверить, что список L получается после добавления X на N-е место в список V
Здравствуйте, помогите пожалуйста написать программу на SWI Prolog. Вот само задание: Напишите...

2
Модератор
Эксперт .NET
15466 / 10712 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
14.01.2021, 13:37 2
Цитата Сообщение от limeniye Посмотреть сообщение
"This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread."
Изменять значения свойств UI элементов надо в основном UI потоке.
Событие PropertyChanged проходит в Привязки через рефлексию.
Поэтому для обычных свойств с INPC явного перехода в Диспетчер не нужно.

Но для событий CollectionChanged и CanExecuteChanged нужен явный переход в Диспетчер.

Диспетчер в VM лучше передавать явно в конструктор при его вызове.
C#
1
2
3
4
5
public class ViewModel
{
   public Dispatcher Dispatcher {get;}
   public ViewModel(Dispatcher dispatcher) => Dispatcher = dispatcher;
}
В Code Behind App
C#
1
   ViewModel viewModel = new ViewModel(Dispatcher);
В самом методе
C#
12
13
14
15
16
17
18
19
       private void ActionListChanged(object sender, NotifyDictionaryChangedEventArgs<string, CurrencyDto> e)
        {
            CurrencyViewModel currency = new CurrencyViewModel(e.NewValue);
            if (Dispatcher.CheckAccess())
                 CurrencyList.Add(currency);
            else 
                Dispatcher.BeginInvoke(() => CurrencyList.Add(currency));
        }
1
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
20.01.2021, 14:32  [ТС] 3
Элд Хасп, проблема решилась при изменении логики добавления на логику ииз этой Хеш-функция и ISet множества темы.
0
20.01.2021, 14:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2021, 14:32
Помогаю со студенческими работами здесь

Ошибка маппера типов из Model во ViewModel(Error mapping types)
Модель public decimal Id { get; set; } public int CompanyId { get; set; } ...

Mvvm ViewModel в ViewModel
Есть одно окошко там много вкладок, в каждой вкладке есть подвкладки и там много разных таблиц и...

Добавления в односвязный список
Доброго времени суток, проходил я тут помеж тем С++, и увидел тему про список, в котором я давно...

Функция добавления элемента в список
Здравствуйте, мой код работает правильно, по преподаватель сделал замечание. Помогите пожалуйста...

Операция добавления в Двунаправленный список
Всем привет ребята, есть методы(необходимы пока лишь они)...так вот ошибки там начинаются с...

Функция добавления элемента в список
Мне нужно написать функцию к уже имеющейся программе. Я ввожу К - число &quot;+&quot;-ых элементов списка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru