Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C#] Cercare dentro ad una ListView

    ciao!

    ho un problema nelk cercare dentro ad una ListView usando una SearchBar.
    questo è il mio model:
    codice:
           namespaceBook.ViewModels
    {
    publicclassItemsViewModel:BaseViewModel
    {
    publicObservableCollection<Item>Items{get;set;}
    publicCommandLoadItemsCommand{get;set;}
    
    publicItemsViewModel()
    {
    Items=newObservableCollection<Item>();
    LoadItemsCommand=newCommand(async()=>awaitExecuteLoadItemsCommand());
    }
    
    asyncTaskExecuteLoadItemsCommand()
    {
                 // riempio la lista
    }
    
    publicObservableCollection<Item>GetItems()
    {
    returnItems;
    }
    }
    }
    questa la view:
    codice:
           namespaceBook.Views
    {
    publicpartialclassItemsPage:ContentPage
    {
    ItemsViewModelviewModel;
    
    publicItemsPage()
    {
    InitializeComponent();
    
    BindingContext=viewModel=newItemsViewModel();
    }
    
    protectedoverridevoidOnAppearing()
    {
    base.OnAppearing();
    
    if(viewModel.Items.Count==0)
    viewModel.LoadItemsCommand.Execute(null);
    }
    
    voidHandle_TextChanged(objectsender,TextChangedEventArgse)
    {
    ItemsListView.BeginRefresh();
    if(string.IsNullOrWhiteSpace(e.NewTextValue))
    {
    ItemsListView.ItemsSource=viewModel.GetItems();
    }
    else
    {
    ItemsListView.ItemsSource=viewModel.GetItems().Where(i=>i.Title.ToLower().Contains(e.NewTextValue.ToLower()));
    }
    ItemsListView.EndRefresh();
    }
    }
    }
    in pratica:
    - in caricamento di app la lista si riempie correttamente
    - quando scrivo, la lista si svuota (come se non trovasse nulla)
    - quando cancello la SearchBar, viene ricaricata; ma sembra che richieda di nuovo i dati al server

    qualche suggerimento??

  2. #2
    pensco che il problema potrebbe essere qui:
    codice:
     //var mockItems = new List<Item>
    //{
    //    new Item { Id = Guid.NewGuid().ToString(), Title = "100", Author="This is an item description." },
    //    new Item { Id = Guid.NewGuid().ToString(), Title = "second item", Author="This is an item description." },
    //    new Item { Id = Guid.NewGuid().ToString(), Title = "Third item", Author="This is an item description." },
    //    new Item { Id = Guid.NewGuid().ToString(), Title = "Fourth item", Author="This is an item description." },
    //    new Item { Id = Guid.NewGuid().ToString(), Title = "Fifth item", Author="This is an item description." },
    //    new Item { Id = Guid.NewGuid().ToString(), Title = "Sixth item", Author="This is an item description." },
    //};
    
    var client = new HttpClient();
    var json = await client.GetStringAsync(Costanti.allBooks);
    List<Item> mockItems = JsonConvert.DeserializeObject<List<Item>>(json);
    
    foreach (var item in mockItems)
    {
       items.Add(item);
    }
    il codice commentato era quello di esempio.
    con quello funziona anche il search.
    con il mio invece viene riempita la lista, ma il search non funziona.
    sinceramente non riesco bene a capire la differenza!
    qualche suggerimento??

  3. #3
    il problema è nell'await.

    cioè, questo non funziona:
    codice:
            public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
            {
                var mockItems = new List<Item>
                {
                    new Item { Id = Guid.NewGuid().ToString(), Title = "100", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "second item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Third item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Fourth item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Fifth item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Sixth item", Author="This is an item description." },
                };
    
                var client = new HttpClient();
                var json = await client.GetStringAsync(Costanti.allBooks);
                //var mockItems = JsonConvert.DeserializeObject<List<Item>>(json);
    
                items = mockItems;
    
                return await Task.FromResult(items);
            }
    mentre questo funziona (anche se poi nella realtà il json remoto non lo uso):
    codice:
            public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
            {
                var mockItems = new List<Item>
                {
                    new Item { Id = Guid.NewGuid().ToString(), Title = "100", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "second item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Third item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Fourth item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Fifth item", Author="This is an item description." },
                    new Item { Id = Guid.NewGuid().ToString(), Title = "Sixth item", Author="This is an item description." },
                };
    
                var client = new HttpClient();
                var json = client.GetStringAsync(Costanti.allBooks);
                //var mockItems = JsonConvert.DeserializeObject<List<Item>>(json);
    
                items = mockItems;
    
                return await Task.FromResult(items);
            }
    il problema è che mi da errore se lo levo e provo ad usare i dati remoti:
    codice:
            public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
            {
                var client = new HttpClient();
                var json = client.GetStringAsync(Costanti.allBooks);
                var mockItems = JsonConvert.DeserializeObject<List<Item>>(json);
    
                items = mockItems;
    
                return await Task.FromResult(items);
            }
    ottengo questo errore:
    codice:
    MockDataStore.cs(71,71): Error CS1503: Argument 1: cannot convert from 'System.Threading.Tasks.Task<string>' to 'string' (CS1503)

  4. #4
    il problema era legato al refresh nell'evento sulla SearchBar:
    codice:
    ItemsListView.BeginRefresh();
    ............
    ItemsListView.EndRefresh();
    eliminate quelle due righe, ha funzionato tutto.
    ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.