I'm trying to verify if ListView displays or refreshes items instantly whenever we add an object to the Observable Collection, but it doesn't. I have tested in Debugging mode in Visual Studio, and ListView only displays items once all the objects have been iterated and added to the Observable Collection (for e.g. in the below Subscribe method). What am I missing?
Note: I've also applied INotifyPropertyChanged both on underlying Model and ViewModel (Page1 in this example) so that ListView can listen to property changed event of collection as well, but no luck.
Here's the code example:
public partial class Page1 : ContentPage, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
ObservableCollection<TestModel> trackListObservable;
public ObservableCollection<TestModel> Items
{
get { return trackListObservable; }
set
{
trackListObservable = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(Items)));
}
}
}
public Page1 ()
{
InitializeComponent ();
Items = new ObservableCollection<TestModel>();
BindingContext = Items;
}
protected override void OnAppearing()
{
base.OnAppearing();
List<int> test = new List<int>() { 1, 2, 3, 4, 5 };
test.ToObservable()
.SelectMany(x => Observable.Start(() => Increment(x)))
.Select(x => x)
.Subscribe(result => Device.BeginInvokeOnMainThread(() => {
Items.Add(new TestModel() { Number = result });
}));
}
int Increment(int num)
{
return num++;
}
}
public class TestModel : INotifyPropertyChanged
{
private int number;
public int Number
{
get { return number; }
set
{
number = value;
OnPropertyChanged(nameof(Number));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged == null)
return;
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}