hekkaaa
@hekkaaa
C#/.NET Developer

Как реализовать автоматическое обновление данных таблицы DataGrid в WPF при изменении свойств?

Привет

Несколько дней ищу ответ на данный вопрос.
Проблема в том, что данные ObservableCollection обновляются, но при этом не обновляются в самой DataGrid без какого-то стороннего события. Например нажатия кнопки или дважды кликнуть по самой таблице.

В моем случае свойства объектов находящихся в ObservableCollection будут постоянно меняется.
Например Age постоянно в отдельном потоке будут прибавлять каждые 2 секунды по +1.
И как бы я не старался, данные не обновляются именно на View.

Да, можно сделать реализацию при событии типа isVisibleChanged через .Refresh().
Во-первых так не получилось. Во-вторых думаю есть более правильный способ.

Вероятно, я не так обновляю данные через свойства или что-то не учел при работе с PropertyChanged().
Предварительно я посмотрел некоторые ответы типа тык и тык. Первый вариант не совсем мне подходит. Второй близкий к моему, но не понятен в предлагаемом решении.

Прошу подсказать.

Текущее состояние кода такое.
Model:

public class Peoples : INotifyPropertyChanged
    {
        public string name;
        public string description;
        public int age;

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                OnPropertyChanged("Title");
            }
        }
        public string Description
        {
            get { return description; }
            set
            {
                description = value;
                OnPropertyChanged("Company");
            }
        }
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Price");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }


ViewModel:

public class ApplicationViewModel : INotifyPropertyChanged
    {
        private int _count;

        private ObservableCollection<Peoples> _peopler;
        public ObservableCollection<Peoples> Peopler 
        {
            get { return _peopler; }
            set
            {
                _peopler = value;
                OnPropertyChanged();
            }
        }

        public int Count 
        {
            get { return _count; }
            set { _count = value; OnPropertyChanged(); }
        }

        public ApplicationViewModel()
        {
            Peopler = new ObservableCollection<Peoples>()
            {
                new Peoples(){ Age = 45, Description= "Meow", Name = "Cat"},
            };

            Task.Factory.StartNew(() =>
            {
                while (true)
                {
                   Task.Delay(2000).Wait();
                   Peopler.LastOrDefault().Age++;
                   Count++;
                   OnPropertyChanged();
                }
            });
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }


View:

<DataGrid x:Name="DG1" ItemsSource="{Binding Peopler, UpdateSourceTrigger=PropertyChanged}">
        </DataGrid>
        <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="103,177,0,0" TextWrapping="Wrap" Text="{Binding Count}" VerticalAlignment="Top" Width="120" />
        <TextBox Grid.Column="1" HorizontalAlignment="Left" Margin="131,131,0,0" TextWrapping="Wrap" Text="{Binding Count}" VerticalAlignment="Top" Width="120"/>


Для визуального понимания где именно проблема, прикладываю скрин.
627b7ed3c37f5278305564.png
  • Вопрос задан
  • 1365 просмотров
Решения вопроса 1
@Ksarrik
У вас опечатка:
public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Price");
            }
        }

исправьте на
public int Age
        {
            get { return age; }
            set
            {
                age = value;
                OnPropertyChanged("Age");
            }
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы