如何通过ListView ContextAction获取ObservableCollection项?

时间:2017-06-09 12:29:06

标签: c# listview xamarin.forms observablecollection

我需要使用contextactions从我的ObservableCollection<ViewModels.ZoneViewModel>中删除一个项目。我正在尝试这样做,但最终我没有删除任何内容,因为我想要删除的对象只是从listview中取出,而不是observablecollection。

public async void OnDelete(object sender, EventArgs e) {
  var menuItem = ((MenuItem) sender);

  if (menuItem != null) {
    var selectedZone = (ViewModels.ZoneViewModel) menuItem.CommandParameter;

    var deleteAction = await DisplayActionSheet("Delete " + selectedZone.Name + "?", "Cancel", "Delete");

    switch (deleteAction) {
      case "Delete":

        await DisplayAlert("delete Context Action clicked: ", menuItem.CommandParameter + "Name= " + selectedZone.Name + " Address=" + selectedZone.Address + " Image=" + selectedZone.Image, "OK");
        Zones = await BlobCache.UserAccount.GetObject < ObservableCollection < ViewModels.ZoneViewModel >> ("zones");
        Zones.Remove(selectedZone);
        await BlobCache.UserAccount.InsertObject < ObservableCollection < ViewModels.ZoneViewModel >> ("zones", Zones);
        zonesList.ItemsSource = Zones;

        break;
    }

  }

}

那么如何从我的observablecollection中获取正确的项目,我通过上下文操作选择的那个?

1 个答案:

答案 0 :(得分:1)

在这一行

Zones = await BlobCache.UserAccount.GetObject < ObservableCollection < ViewModels.ZoneViewModel >> ("zones");

使用新的Zones替换整个ObservableCollection对象,导致您要删除的对象不再存在。虽然你可能会认为它仍然存在,因为属性可能是相同的,但它是一个不同的对象。

您可以通过不获取Zones的新版本来修复它。或者像这样编辑删除:

Zones.Remove(Zones.Single(z => z.Id == selectedZone.Id));

假设ZoneViewModel对象具有唯一的属性Id。您还需要使用。

导入Linq