Xamarin.Form问题(如果从Akavache缓存绑定,则ListView不会刷新)

Xamarin.Form问题(如果从Akavache缓存绑定,则ListView不会刷新),listview,xamarin,akavache,Listview,Xamarin,Akavache,我在刷新列表时遇到问题 在Visual Studio 2019(Xamarin.Forms 4.3.0.991250)和Akavache 6.6.1中,我正在使用带有初始默认值的MasterDetailPage,其中有一个变量是ObservableCollection类型的项 首先,我向缓存中添加了一个项(我称这个对象为TodoItem)。然后用从Akavache缓存获得的项绑定显示ListView,但它不工作,项具有值->ListView不刷新 我试过一些东西: 更改版本(Xamarin.F

我在刷新列表时遇到问题

在Visual Studio 2019(Xamarin.Forms 4.3.0.991250)和Akavache 6.6.1中,我正在使用带有初始默认值的
MasterDetailPage
,其中有一个变量是
ObservableCollection
类型的项

首先,我向缓存中添加了一个项(我称这个对象为TodoItem)。然后用从Akavache缓存获得的项绑定显示ListView,但它不工作,项具有值->
ListView
不刷新

我试过一些东西:

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

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

  • 如果应用程序正在运行,我会更改布局并保存(Xaml热加载)->它正在工作

    公共ObservableCollection项{get;set;}=new ObservableCollection()

    #区域添加新命令
    专用命令_addNewCommand;
    公共命令AddNewCommand=>
    _添加新命令??(_addNewCommand=new命令(async(p)=>await AddNewExecute(),(p)=>!IsBusy));
    专用异步任务AddNewExecute()
    {
    var key=Guid.NewGuid().ToString().Substring(0,5);
    等待BlobCache.LocalMachine.InsertObject(key,new-TodoItem(){Id=key.Substring(0,2),Text=“abc”,Description=“def”},new-TimeSpan(1,0,0));
    var list=await BlobCache.LocalMachine.getAllObject();
    项目=新的可观察收集(列表);
    }
    #端区
    

要更改UI的变量bindend,必须在内部进行更改

大概是这样的:

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);
        });
}
private异步任务AddNewExecute()
{
var key=Guid.NewGuid().ToString().Substring(0,5);
等待BlobCache.LocalMachine.InsertObject(key,new-TodoItem())
{
Id=key.Substring(0,2),Text=“abc”,Description=“def”},newtimespan(1,0,0));
Device.beginInvokeMainThread(异步()=>{
var list=await BlobCache.LocalMachine.getAllObject();
项目=新的可观察收集(列表);
});
}

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

请不要将代码作为图像发布请将代码包装在AddNewExecute inside、Device.BeginInvokeOnMainThread(()=>{//您的代码在这里});您需要发布xaml和Items属性。Tks@ottermatic,我稍后会尝试转发结果…Tks@Adrián Romero,但此代码失败,Device.beginInvokeMainThread无法在new TodoItem()块中运行。??为什么失败?(你能看到我的编辑吗?)
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);
        });
}