【问题标题】:How to get ObservableCollection item by ListView ContextAction?如何通过 ListView ContextAction 获取 ObservableCollection 项?
【发布时间】:2017-06-09 12:29:06
【问题描述】:

我需要使用 contextactions 从我的ObservableCollection<ViewModels.ZoneViewModel> 中删除一个项目。我正在尝试这样做,但最终我什么也没删除,因为我要删除的对象只是从列表视图中获取的,而不是从 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 中删除正确的项目,即我通过 contextaction 选择的项目?

【问题讨论】:

  • 您在删除之前正在创建区域的新副本;这意味着您的 selectedZone 指向的副本与您的集合中的副本不同,因此它不会从集合中删除。尝试跳过区域的刷新,或搜索更新的副本以在删除之前按 ID 找到正确的项目。

标签: c# listview xamarin.forms observablecollection


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多