Dans mon application, je fais glisser et déposer un élément du ListView
dans le bouton de la corbeille et il supprime l'élément. Pour voir le changement je dois retourner à une page et puis ouvrir à nouveau la page suivante pour voir que l'article a été supprimé. Ce que je veux, c'est quand je dépose l'article au bouton de la corbeille pour montrer la mise à jour en même temps.Comment mettre à jour un ListView après avoir supprimé un élément?
Avec le code que j'ai en ce moment, quand je vais à la page ListView
charge pendant une seconde, puis il disparaît.
Quelqu'un peut-il me dire comment résoudre ce problème? Voici mon code:
public sealed partial class BasketPage : Page, INotifyPropertyChanged
{
private MobileServiceCollection<Information, Information> tempItem;
private ObservableCollection<Information> items;
private ObservableCollection<Information> RefreshedItems { get; set; }
private IMobileServiceTable<Information> informationTable = App.MobileService.GetTable<Information>();
private Information selectedInformation;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public BasketPage()
{
this.InitializeComponent();
this.items = new ObservableCollection<Information>();
this.refreshedItems = new ObservableCollection<Information>();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
getListData();
base.OnNavigatedTo(e);
}
private async void getListData()
{
var query = App.conn.Table<Information>();
foreach (var item in query)
{
tempItem = await informationTable
.Where(todoItem => todoItem.Id == item.Name)
.ToCollectionAsync();
RefreshedItems.Add(tempItem.ElementAt(0));
}
}
private void BackButton_Click(object sender, RoutedEventArgs e)
{
if (Frame.CanGoBack)
{
Frame.GoBack();
}
}
private void CollectedItemsListView_ItemClick(object sender, ItemClickEventArgs e)
{
selectedInformation = (Information)e.ClickedItem;
Frame.Navigate(typeof(MediaViewPage), selectedInformation);
}
private void CollectedItemsListView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
{
var item = string.Join(",", e.Items.Cast<Information>().Select(i => i.Id));
e.Data.SetText(item);
e.Data.RequestedOperation = DataPackageOperation.Move;
}
private void TrashButton_DragOver(object sender, DragEventArgs e)
{
if (e.DataView.Contains(StandardDataFormats.Text))
{
e.AcceptedOperation = DataPackageOperation.Move;
}
}
private async void TrashButton_Drop(object sender, DragEventArgs e)
{
if (e.DataView.Contains(StandardDataFormats.Text))
{
var id = await e.DataView.GetTextAsync();
var query = App.conn.Table<Information>();
var itemToDelete = query.Where(p => p.Name == id).FirstOrDefault();
RefreshedItems.Remove(itemToDelete);
App.conn.Delete(itemToDelete);
App.conn.Commit();
}
}
}
est ici I La liaison fais dans le fichier XAML:
<ListView x:Name="CollectedItemsListView"
ItemsSource="{Binding refreshedItems}"
...
il semble que vous définissez CollectedItemsListView.ItemsSource plusieurs fois, et la mise en page ne change pas, ce sur la liaison ItemsSource? – RTDev
J'ai supprimé le CollectedItemsListVi ew.ItemsSource du TrashButton mais toujours le même, donc je l'appelle juste une fois. – Premo
ne l'appelez pas, utilisez Binding dans le xaml, liez ItemsSource à ObservableCollection, puis chaque suppression, insertion et ainsi de suite (effectuée sur cette collection) sera correctement affichée sur la mise en page – RTDev