Проблема Xamarin.Form (ListView не refre sh, если привязка из кэша Akavache) - PullRequest
0 голосов
/ 13 февраля 2020

Я столкнулся с проблемой с refre sh list.

Я использую MasterDetailPage с установкой по умолчанию в Visual Studio 2019 (Xamarin.Forms 4.3.0.991250) и Akavache 6.6.1, имеет переменная это элементы типа ObservableCollection<TodoItem>.

Во-первых, я добавил один элемент в кеш (я называю этот объект TodoItem). А затем показать ListView с привязкой Items, полученной из кэша Akavache, но она не работает, Items имеет значения -> ListView not refre sh.

Я пытался с чем-то:

  • Изменить версию (Xamarin.Forms & Akavache), например: XF 4.1 наивысшая версия и akavache downgrade 6.0, 6.1, 6.2 ... => не работает.

  • Если элементы настройки с жестким кодом new ObservableCollection (new ListView () {...}) => работают.

  • Если приложение работает, я что-то изменяю в макете и сохраняю (горячая перезагрузка Xaml) -> оно работает.

    publi c ObservableCollection Items {get; набор; } = new 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
    

1 Ответ

0 голосов
/ 13 февраля 2020

Чтобы внести изменения в переменную bindend для пользовательского интерфейса, вы должны сделать это внутри 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);
        });
}

В этом как вы меняете переменную в потоке пользовательского интерфейса

...