【问题标题】:delete item from listview on clicking an element in it and update listview using mvvm单击其中的元素时从列表视图中删除项目并使用 mvvm 更新列表视图
【发布时间】:2019-07-09 18:38:40
【问题描述】:

我有一个列表视图并将其源分配为

lvItemSigns.ItemsSource = viewmodel.ItemSignsList;

在 listview 数据单元中我正在添加按钮,当它被点击时它应该删除项目并且列表应该自动更新。

在页面中:

protected override void OnAppearing()
{
  base.OnAppearing();
  InitializeComponent();
  VM = new ItemSignsTabViewModel(this);
  this.BindingContext = VM;
  lvItemSigns.IsGroupingEnabled = true;
  lvItemSigns.HasUnevenRows = true;
  lvItemSigns.ItemsSource = VM.ItemSignsGroupedList;
}
class DataCell : ViewCell
{
  public DataCell()
  {
    var DeleteDuplicateItem = new Button();
    DeleteDuplicateItem.Clicked += Remove_Clicked;
  }
}



private void Remove_Clicked(object sender, EventArgs e)
{
var button = sender as Button;
var ticketItem = button.BindingContext as TicketItem;
var vm = BindingContext as ItemSignsTabViewModel;

// here vm is always getting null so I had to use an event
vm.RemoveItemCommand.Execute(ticketItem);
}

在上面的代码中,vm总是为null,如果我使用新的实例,我的列表不会更新。

在视图模型中:

public Command<TicketItem> RemoveItemCommand
    {
        get
        {
            return new Command<TicketItem>((TicketItem) =>
            {
                ItemSignsList.Remove(ItemSignsList.Where(i => i.MobileID == TicketItem.MobileID).Single());
            });
        }
    }

那么如何让视图模型的实例在点击按钮时更新我的​​列表?

【问题讨论】:

  • 这应该可行,尽管这样做很笨拙。您在哪里分配页面的 BindingContext?为什么不直接创建一个类级别的 ViewModel 引用而不是强制转换 BindingContext?
  • 为什么不直接绑定ItemSignsTabViewModel的命令呢?你也可以显示视图吗?
  • 我创建了一个类级别的视图模型,但无法在数据单元格中访问它。为了解决这个问题,我在单击按钮后实现了一个事件,并在 viewmodel 中注册了该事件。
  • 没有。我无法使用数据单元中的项目访问视图模型,因此在单击按钮时使用了事件
  • 你能展示你完整的 Page 代码吗? lvItemSigns.ItemsSource = viewmodel.ItemSignsList;这里生成了viewmodel,无法访问?

标签: listview mvvm xamarin.forms


【解决方案1】:

VM = new ItemSignsTabViewModel(this);

你已经生成了viewmodel,为什么不直接在下面使用呢?

DeleteDuplicateItem.Clicked += Remove_Clicked;

private void Remove_Clicked(object sender, EventArgs e)
 {
   var button = sender as Button;
   var ticketItem = button.BindingContext as TicketItem;
   VM.RemoveItemCommand.Execute(ticketItem);
 }

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多