0

我遇到了刷新列表的问题。

MasterDetailPage在 Visual Studio 2019 (Xamarin.Forms 4.3.0.991250) 和 Akavache 6.6.1 中使用 init default,变量是 Items of type ObservableCollection<TodoItem>

首先,我将一个项目添加到缓存中(我称这个对象为 TodoItem)。然后显示 ListView 与从 Akavache 缓存获取的 Items 绑定,但它不起作用,Items 有值 ->ListView不刷新。

我尝试了一些东西:

  • 更改版本(Xamarin.Forms 和 Akavache),例如:XF 4.1 最高版本和 akavache 降级 6.0、6.1、6.2... => 不工作。

  • 如果使用硬编码 new ObservableCollection(new ListView(){ ... }) => 设置项目,它正在工作。

  • 如果应用程序正在运行,我会更改布局上的某些内容并保存(Xaml 热重载)-> 它正在工作。

    公共 ObservableCollection 项目 { 获取;放; } = 新的 ObservableCollection();

    #region AddNewCommand
    
    private Command _addNewCommand;
    
    public Command AddNewCommand =>
        _addNewCommand ?? (_addNewCommand = new Command(async (p) => await AddNewExecute(), (p) => !IsBusy));
    
    private async Task AddNewExecute()
    {
        var key = Guid.NewGuid().ToString().Substring(0, 5);
        await BlobCache.LocalMachine.InsertObject<TodoItem>(key, new TodoItem() {Id=key.Substring(0,2),Text="abc",Description="def" }, new TimeSpan(1, 0, 0));
        var list = await BlobCache.LocalMachine.GetAllObjects<TodoItem>();
        Items = new ObservableCollection<TodoItem>(list);
    }
    #endregion
    
4

1 回答 1

0

为了更改绑定到 UI 的变量,您必须在BeginInvokeOnMainThread中进行

像这样的东西:

private async Task AddNewExecute()
{
     var key = Guid.NewGuid().ToString().Substring(0, 5);
     await BlobCache.LocalMachine.InsertObject<TodoItem>(key, new TodoItem() 
        {
          Id=key.Substring(0,2),Text="abc",Description="def" }, new TimeSpan(1, 0, 0));
          Device.BeginInvokeOnMainThread (async () => {
          var list = await BlobCache.LocalMachine.GetAllObjects<TodoItem>();
          Items = new ObservableCollection<TodoItem>(list);
        });
}

通过这种方式,您正在更改 UI 线程上的变量

于 2020-02-13T17:55:04.583 回答