Привет
Несколько дней ищу ответ на данный вопрос.
Проблема в том, что данные
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"/>
Для визуального понимания где именно проблема, прикладываю скрин.