【问题标题】:Create Multiselect Listview with Xamarin Forms(Xamarin Cross Platform)使用 Xamarin 表单创建多选列表视图(Xamarin 跨平台)
【发布时间】:2015-08-21 09:20:39
【问题描述】:

我正在尝试在 Listview 的每个项目中实现一个带有 Checkbox 控件的 Listview。如果我想删除两个项目,我将检查这两个项目并单击删除它应该删除。我探索了有关这种概念的更多信息,但没有也可以在 Github 中找到单个演示示例。

编程语言:Xamarin 表单不在 Xamarin android 或 Xamain IOS 中。我已经知道如何在这些平台中实现。但我没有任何示例代码至少可以更好地理解“Xamarin Forms 中的多选和删除操作”

【问题讨论】:

  • 我假设你已经浏览了所有Xamarin.Forms samples?
  • 您是否尝试过在列表视图中使用自定义单元格?

标签: listview xamarin multi-select xamarin-forms


【解决方案1】:

或创建自定义 ViewCell 布局(https://developer.xamarin.com/guides/cross-platform/xamarin-forms/user-interface/listview/customizing-cell-appearance/ - 自定义单元格章节)

  • SwitchCell.OnPropertyYourCustomViewCell.Checkbox.CheckedPropertyViewModel.ObservableCollection.IsChecked 属性绑定(如在SwitchEntryTwoBinding 示例中)

  • 然后你可以创建一个ButtonToolbarItem 来调用迭代ViewModel.ObservableCollection 中的每个项目并在IsChecked=true 中删除它的方法。

【讨论】:

  • 这是我的代码,当我单击删除按钮时,必须从列表视图 [Xamarin Forms] 中删除项目中选中的行。
【解决方案2】:

首先创建一个带有开关的自定义单元格(或实现SwitchCell)。然后将开关的值绑定到数据模型中的布尔值。然后,在按钮单击事件上,一个简单的 Linq 查询就可以解决问题。

确保您的项目列表是ObservableCollection,这样当您删除项目时,更改会正确传播到 ListView。

【讨论】:

    【解决方案3】:

    我们在这里创建了一个多选 ListView 控件。它适用于所有平台,并且没有特定于平台的代码。 https://github.com/MelbourneDeveloper/Adapt.Presentation/blob/master/Adapt.Presentation.Standard/Adapt/Presentation/Controls/AdaptListView.cs

    这里包含一个完整的示例: https://github.com/MelbourneDeveloper/Adapt.Presentation.git

    这对异步行为非常有效。 IE。您可以按任何顺序设置 ItemsSource 或 SelectedItems。回购中有一个多选样本: https://github.com/MelbourneDeveloper/Adapt.Presentation.git

    还有一种行为可以使用按钮切换选择模式,以便您可以跳到选定的记录,或者在列表视图中选择许多记录: https://github.com/MelbourneDeveloper/Adapt.Presentation/blob/master/Adapt.Presentation.Standard/Adapt/Presentation/Behaviours/AdaptListViewSelectionModeToggleBehavior.cs

    此行为是相关的,因为它允许您从列表视图中删除选定的项目: https://github.com/MelbourneDeveloper/Adapt.Presentation/blob/master/Adapt.Presentation.Standard/Adapt/Presentation/Behaviours/RemoveFromCollectionBehavior.cs

    很遗憾,这目前不支持 CheckBox,但该功能无需 CheckBox 即可工作,我们将来可能会添加该功能。

    【讨论】:

      【解决方案4】:

      MVVM 方法介绍如何拥有一个 Xamarin.Forms.ListView 来保存一组可以选择删除的项目。通过按钮命令启动删除。

      查看:

      • 持有ListView
      • ListView CellsSwitchCell 或具有可以绑定到布尔值(最好是 Xamarin.Forms.Switch)的控件的自定义单元格
      • 持有Button "Delete Items"

      型号:

      • 实现INotifyPropertyChanged接口(更新视图)
      • 保存任何其他数据
      • 持有public bool ShouldBeDeleted { ... setter 调用 PropertyChanged() ...),这将绑定到 Xamarin.Forms.Switch.IsToggled bindable property

      视图模型:

      • 是视图的BindingContext
      • 拥有IList/IEnumerableModel 实例
      • IList/IEnumerable 将设置为 Views ListView 的 "ItemsSource"-Property
      • 持有一个绑定到“删除项目”按钮的Command property 的命令。此命令应调用一个方法,该方法循环遍历 IList/IEnumerable 并删除所有将 ShouldBeDeleted 设为 true 的项目。
      • 使用ObservableCollection 作为项目列表。它会在添加、删除模型或清除/刷新列表时更新视图

      【讨论】: