Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
17 / 14 / 7
Регистрация: 04.02.2017
Сообщений: 486

Не обновляется ListView

10.10.2019, 17:43. Показов 3263. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет не пойму в чём проблема обновляется через раз ListView. При переходи с одного UserControl на другой и обратно где находится сам Listview сразу не обновляется а обновляется только если я перейду ещё на другой UserControl и снова вернусь тогда будет виден список почему такое происходит? Такая же проблема была и с обновлением ProgressBar но я решил её таким способом. Заранее спасибо
C#
1
Application.Current.Properties["HistoryModel"] = HistoryModel;
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 <UserControl.DataContext>
        <local:HistoryViewModel/>
    </UserControl.DataContext>
 
<Grid>
<ListView Grid.Row="1" ItemsSource="{Binding ListHistory , UpdateSourceTrigger=PropertyChanged}">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Maximal Pulse Per Day" DisplayMemberBinding="{Binding HistoryModel.MaximalPulsePerDay, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Header="Incident Location" DisplayMemberBinding="{Binding HistoryModel.CurrentLocation, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Header="Time of Incident" DisplayMemberBinding="{Binding HistoryModel.TimeIncedent, UpdateSourceTrigger=PropertyChanged}"/>
                        <GridViewColumn Header="Serial Number Of Module" DisplayMemberBinding="{Binding HistoryModel.SerialNumberOfModule, UpdateSourceTrigger=PropertyChanged}"/>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
 <Button Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"  Content="Subbmit" Margin="1100,0,0,0" 
              MinWidth="100" MinHeight="50" Foreground="Snow"  Click="Send_Button" Cursor="Hand" Command="{Binding DisplayHistoryCommand}">
            <Button.Template>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border CornerRadius="5" MinWidth="100" MinHeight="50">
                        <Border.Background>
                            <LinearGradientBrush SpreadMethod="Reflect" StartPoint="0,0" EndPoint="0,0.5">
                                <GradientStop Offset="1" Color="Black"/>
                                <GradientStop Offset="0.4" Color="OrangeRed"/>
                            </LinearGradientBrush>
                        </Border.Background>
                        <ContentControl HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Cursor="{TemplateBinding Cursor}"
                                        FontSize="{TemplateBinding FontSize}" FontWeight="{TemplateBinding FontWeight}" Content="{TemplateBinding Content}"
                                        VerticalAlignment="{TemplateBinding VerticalAlignment}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}"/>
                    </Border>
                </ControlTemplate>
            </Button.Template>
        </Button>
</Grid>


ViewModel

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class HistoryViewModel : ObserverableObject, IPageViewModel
    {
        private ICommand _displayHistoryCommand;
        public HistoryModel HistoryModel { get; } = new HistoryModel();
        public static ObservableCollection<HistoryModel> listHistory { get; private set; }
 
        public HistoryViewModel()
        {
            Application.Current.Properties["HistoryModel"] = HistoryModel;
        }
        public string Name
        {
            get { return "History"; }
        }
 
        public ObservableCollection<HistoryModel> ListHistory
        {
            get
            {
                return listHistory;
            }
            set
            {
                if (value != listHistory)
                {
                    listHistory = value;
                    OnPropertyChanged();
                }
            }
        }
 
        public ICommand DisplayHistoryCommand
        {
            get
            {
                if (_displayHistoryCommand == null)
                {
                    _displayHistoryCommand = new RelayCommand(param => DownloadDataFromDatabase(), param => true);
                }
                return _displayHistoryCommand;
            }
        }
 
        public async void DownloadDataFromDatabase()
        {
            await Task.Run(() => ServiceHistory.DownloadHistoryClient((o, ea) =>
            {
                ListHistory = new ObservableCollection<HistoryModel>(ea.ListHistory);
            }));
           
        }
    }


Модель для типа данных ViewModel
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 public class HistoryModel : ObserverableObject
    {
        private string _maxPulsePerDay;
        private string _incidentLocation;
        private string _timeIncident;
        private string _serialNumberOfModule;
        private static double _value;
        
        public double Value
        {
            get { return _value; }
            set
            {
                if (value != _value)
                {
                    _value = value;
                    OnPropertyChanged();
                }
            }
        }
        public HistoryModel()
        {
 
        }
        public HistoryModel(string pulse,string location,string time,string sn_module)
        {
            MaximalPulsePerDay = pulse;
            CurrentLocation = location;
            TimeIncedent = time;
            SerialNumberOfModule = sn_module;
        }
        public string SerialNumberOfModule
        {
            get { return _serialNumberOfModule; }
            set
            {
                if (value != _serialNumberOfModule)
                {
                    _serialNumberOfModule = value;
                    OnPropertyChanged();
                }
            }
        }
        public string CurrentLocation
        {
            get
            {
                return _incidentLocation;
            }
            set
            {
                if (value != _incidentLocation)
                {
                    _incidentLocation = value;
                    OnPropertyChanged();
                }
            }
        }
        public string MaximalPulsePerDay
        {
            get { return _maxPulsePerDay; }
            set
            {
                if (value != _maxPulsePerDay)
                {
                    _maxPulsePerDay = value;
                    OnPropertyChanged();
                }
            }
        }
        public string TimeIncedent
        {
            get { return _timeIncident; }
            set
            {
                if (value != _timeIncident)
                {
                    _timeIncident = value;
                    OnPropertyChanged();
                }
            }
        }
    }


тут происходит заполнение данных и обновление ProgressBar

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 public class ServiceHistory
    {
        public static void DownloadHistoryClient(EventHandler<HistoryClientEventArgs> callback)
        {
            List<HistoryModel> data = new List<HistoryModel>();
            int precentageComplete = 0;
            int n = 0, highestPrecentageReached = 0;
 
            IProgress<double> progress = new Progress<double>(UpdateProgressBarr);
            for (int i = 0; i < 500000; i++)
            {
                data.Add(new HistoryModel("Object", "Object", "Object", "Object"));
                precentageComplete = (int)((float)n++ / (float)500000 * 100);
                   
                if (precentageComplete > highestPrecentageReached)
                {
                    
                    Thread.Sleep(200);
                    progress.Report(precentageComplete);
                    highestPrecentageReached = precentageComplete;
                }
 
            }
            progress.Report(precentageComplete + 1);
            callback(null, new HistoryClientEventArgs(data)); 
        }
 
        public static void UpdateProgressBarr(double precentage)
        {
            (Application.Current.Properties["HistoryModel"] as HistoryModel).Value = precentage;
        }
}
 
    public class HistoryClientEventArgs : EventArgs
    {
        public List<HistoryModel> ListHistory { get; set; }
 
        public HistoryClientEventArgs(List<HistoryModel> list)
        {
            ListHistory = list;
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2019, 17:43
Ответы с готовыми решениями:

Не обновляется ListView
Есть обработчик кнопки, по которому из sql выбирается некая выборка и возвращается в виде строки, далее парсится в экземпляры класса и...

Не обновляется ListView (MVVM)
Добрый день! Есть View &lt;Window x:Class=&quot;TryTwo.Views.RecordSpecialtiesView&quot; ...

WPF MVVM не обновляется ListView
Всем привет. Только начал изучать MVVM. В чем проблема. Есть 2 ViewModel'a. NewEmployerViewModel наследует BaseViewModel. В...

5
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
10.10.2019, 18:31
FerrariF70, я, по-моему вам уже писал, если используете ObservableCollection, то не надо заменять коллекцию, надо изменять её саму.
Извиняюсь, если предыдущий раз этого писал не вам, но совет тот же.
Если вам нужна ObservableCollection, то создайте её один раз и больше не трогайте.
C#
1
2
public ObservableCollection<HistoryModel> ListHistory { get;}
         = new ObservableCollection<HistoryModel>();
Если же вам нужно не возможность изменения коллекции, а замена её самой, то тогда лучше использовать IEnumerable<T>.

Добавлено через 2 минуты
В данном же случае, проблема возможна из-за замены коллекции не из основного потока.
Хотя так быть не должно. WPF, вроде, нормально обрабатывает INPC из других потоков.
Больше ни какого "криминала" не вижу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
10.10.2019, 18:43
Лучший ответ Сообщение было отмечено FerrariF70 как решение

Решение

Должно быть что-то такое (для ObservableCollection)
C#
44
45
46
47
48
49
        public async void DownloadDataFromDatabase()
        {
            List  <HistoryModel> list = await Task.Run(() => ServiceHistory.DownloadHistoryClient());
            ListHistory. Clear ();
            list.ForEach (history => ListHistory. Add (history));      
        }
1
17 / 14 / 7
Регистрация: 04.02.2017
Сообщений: 486
10.10.2019, 21:59  [ТС]
Элд Хасп, Да вы были правы это из-за того что он инициализировал коллекцию постоянно при переходе ViewModel
Цитата Сообщение от Элд Хасп Посмотреть сообщение
я, по-моему вам уже писал, если используете ObservableCollection, то не надо заменять коллекцию, надо изменять её саму.
нет это мы свами ещё не проходили .

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если же вам нужно не возможность изменения коллекции, а замена её самой, то тогда лучше использовать IEnumerable<T>.
А об этом если можно по подробней? на практике никогда не использовал IEnumerable, Ведь все коллекции в принципе наследуются от IEnumerable. Тогда же в чём разница если я с другова потока инициализирую заново IEnumerable его указатель в памяти разве не изменится?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
11.10.2019, 04:23
FerrariF70, изменится.
Преимущество в том, что можно типизировать любым типом коллекции.
Там где нет необходимости использовать методы и особенности какой-то конкретной лучше использовать обобщенный тип IEnumerable или I Collection

Для вашей задачи
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       private IEnumerable<HistoryModel> _listHistory;
       public IEnumerable<HistoryModel> ListHistory
        {
            get => _listHistory;
            set
            {
                if (value != _listHistory)
                {
                    _listHistory = value;
                    OnPropertyChanged();
                }
            }
        }
        public async void DownloadDataFromDatabase()
        {
            ListHistory = await Task.Run(() => ServiceHistory.DownloadHistoryClient());
        }
Добавлено через 2 минуты
FerrariF70, и не понял из вашего кода.
Почему вместо приватного поля экземпляра вы объявили listHistory публичным свойством типа?
1
17 / 14 / 7
Регистрация: 04.02.2017
Сообщений: 486
11.10.2019, 11:46  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там где нет необходимости использовать методы и особенности какой-то конкретной лучше использовать обобщенный тип IEnumerable или I Collection
Да тут я с вами соглашусь без дублирования кода. Сделать общий класс под разные операции с коллекцией и туда обращаться со всех существующих сервисов.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Почему вместо приватного поля экземпляра вы объявили listHistory публичным свойством типа?
а это я наверно забыл когда менял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2019, 11:46
Помогаю со студенческими работами здесь

ListView не обновляется после ObservableCollection<T>.Reverse();
После сортировки потребовалось перевернуть коллекцию. По добавлению нормально обновляется, по реверсу - не хочет. Вроде в .xaml забиндился....

XML файл изменился - Listview не обновляется
Всем большой привет! Есть Listview и привязанный к нему файл XML. Все работает прекрасно, но стал вопрос, если файл будет изменен на...

Не обновляется ListView, когда данные меняются в фоне
При попытке обновить вьюшку в фоне через обработку события вызывающегося в таске IDE глохнет намертво в одном месте (пометил в коде, метод...

Не обновляется ListView
Нужно чтобы после завершения Activity обновлялся listView. При рестарте приложения список обновляется public class NotifActivity...

Не обновляется ListView при изменение данных в ItemsSource
Доброго времени суток! Обработчик ловит клик по ListView и обновляет элемент в списке. Но ListView не обновляет отображаемые данные. Как...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru