首页 > 解决方案 > FlowListView 不使用 Observable 更新 Ui

问题描述

我似乎无法使用定时方法和可观察集合来更新我的流程列表

所以我从定时器开始

 protected async override void OnAppearing()
        {
            MakeWebRequest();
            if (IsConnected)
            {//10 Seconds for Testing
                Device.StartTimer(TimeSpan.FromSeconds(10), () =>
                {
                    Task.Run(async () =>
                    {//This does Fire everytime
                      await InitAsync();
                    });
                    return true;
                });
            }
            else
            {
                await Navigation.PushAsync(new ErrorView());
            }
        }

这是清单

 public class Flashlist : INotifyPropertyChanged
    {
        private ObservableCollection<Product> _items;



        public Flashlist(List<Product> itemList)
        {
            Items = new ObservableCollection<Product>();
            if (itemList == null) return;
            foreach (var itm in itemList)
                Items.Add(itm);

        }

        public ObservableCollection<Product> Items
        {
            get => _items;
            private set
            {
                _items = value;
                OnPropertyChanged("Items");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

该方法应该进行 API 调用然后设置 Listview

   private async Task InitAsync()
        {
            try
            {
                var rest = new RestAPI("http://Site/wp-json/wc/v3/",
                    "xxxxxxxxx", "xxxxxxx");
                var wc = new WCObject(rest);

                var product = await wc.Product.GetAll(new Dictionary<string, string>
                {
                    {"tag", "1486"},
                    {"per_page", "80"}
                });

                if (product != null)
                {
                    _items = new Flashlist(product);
                }
                else
                { 
                    _items.Items.Clear();
                }  
                  productsListView.FlowItemsSource = _items.Items.Where(z => z.status == "publish").ToList();
            }
            catch (Exception ex)
            {
                Crashes.TrackError(ex);
                Analytics.TrackEvent(ex.ToString());
            }
        }

列表更新很好如果我去后端删除/添加产品但用户界面仍然保持不变产品要么保持要么永远不会出现我在其他视图上具有相同的实现并且它工作正常,这是唯一的页面有一个计时器所以我很好奇是否有人有一些想法?

标签: c#xamarin.forms

解决方案


试试这个:

Device.BeginInvokeOnMainThread (() => {
  productsListView.FlowItemsSource = _items.Items.Where(z => z.status == "publish").ToList();
});

它将强制它在主线程上更新。


推荐阅读