Я пытаюсь проверить, отображает ли ListView или обновляет элементы немедленно, когда мы добавляем объект в Observable Collection, но это не так.Я тестировал в режиме отладки в Visual Studio, и ListView отображает элементы только после того, как все объекты были повторены и добавлены в Observable Collection (например, в методе Subscribe ниже).Чего мне не хватает?
Примечание: я также применил INotifyPropertyChanged как к базовой модели, так и к ViewModel (в этом примере Page1), чтобы ListView также мог прослушивать событие изменения свойства коллекции, но не повезло.
Вот пример кода:
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("TrackListObservable"));
}
}
}
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));
}
}
XAML:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamarinApp.Page1"
x:Name="testpage">
<ContentPage.Content>
<StackLayout>
<ListView x:Name="testlist" HasUnevenRows="True" ItemsSource="{Binding BindingContext, Source={x:Reference testpage}}">
<ListView.ItemTemplate>
<DataTemplate>
<Label Text="{Binding Number}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Label Text="Loading Blog..." HorizontalOptions="Center" TextColor="White"/>
</StackLayout>
</ContentPage.Content>
</ContentPage>