Представление «Список форм Xamarin» не отображает добавленные элементы мгновенно с помощью Observable Collection - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь проверить, отображает ли 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...