Xamarin ListView itemSelected MVVM

Posted

技术标签:

【中文标题】Xamarin ListView itemSelected MVVM【英文标题】: 【发布时间】:2018-03-10 14:17:47 【问题描述】:

我是 Xamarin.Form 的新手,非常感谢您的帮助。

我正在为我当前的项目使用 MVVM 模式。我的列表视图中填充了人员,我想在列表视图中选择项目并显示详细信息。不幸的是,我找不到任何解决此问题的示例。

这是我的可绑定类:

public static readonly BindableProperty CommandProperty =
BindableProperty.Create(
      propertyName: "Command",
      returnType: typeof(ICommand),
      declaringType: typeof(ListViewItemSelected));

public ICommand Command

    get  return (ICommand)GetValue(CommandProperty); 
    set  SetValue(CommandProperty, value); 


protected override void OnAttachedTo(ListView bindable)

    base.OnAttachedTo(bindable);

    bindable.ItemSelected += BindableOnItemSelected;
    bindable.BindingContextChanged += BindableOnBindingContextChanged;


private void BindableOnBindingContextChanged(object sender, EventArgs e)

    var lv = sender as ListView;
    BindingContext = lv?.BindingContext;


private void BindableOnItemSelected(object sender, SelectedItemChangedEventArgs e)


    if (Command == null)
        return;
    Command.Execute(null);

我不确定我的 ViewModel 中的下一步。 我创建了 ICommand 属性来执行该方法

public ICommand DetailView  get; set; 

在我的构造函数中我添加了

DetailView = new Command(PathToDetailView);

我创建了这个方法

void PathToDetailView()

     //Which I do not know what should go here to redirect to DetailsPage for each item.

我有点卡在 DetailViewPage 如何获取值。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这里有几个选项,但最简单的可能是将ListViewSelectedItem 绑定到视图模型中的属性

public Person SelectedPerson

  get => _selectedPerson;
  set
  
    if(_selectedPerson == value)
    
      return;
    
    _selectedPerson = value;
    OnPropertyChanged();
  


protected void OnPropertyChanged([CallerMemberName] propertyName = null)

  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

我已经使用了INotifyPropertyChanged 和CallerMemberNameAttribute。 INotifyPropertyChanged 将通知您的视图(或者更确切地说是您的 BindableProperty),您的视图模型中的属性已更改,并使视图有机会更新内容。 CallerMemberNameAttribute 是语法糖,它可以让你省略你正在调用的属性的名称OnPropertyChangedFrom。和你打电话基本一样

OnPropertyChanged(nameof(SelectedPerson));

在您看来,您现在可以将ListView 绑定到SelectedPerson

<ListView ... SelectedItem="Binding SelectedPerson">...</ListView>

并在PathToDetailView 中使用SelectedPerson

【讨论】:

以上是关于Xamarin ListView itemSelected MVVM的主要内容,如果未能解决你的问题,请参考以下文章

ListView 披露指示器按钮 - Xamarin 表单

Xamarin.Forms JSON 对象到 Listview

WillEnterForeground 上的 Xamarin 表单更新 ListView

Xamarin.Forms 解决ListView高度问题

如何在 Xamarin UWP 上的 ListView 中释放内存?

Xamarin 表单中的可扩展 ListView