Xamarin ListView itemSelected MVVM

时间:2017-09-28 18:21:07

标签: listview xamarin mvvm xamarin.forms

我对Xamarin很新。我很感激你的帮助。

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

这是我的Bindable Class:

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 个答案:

答案 0 :(得分:0)

这里有几个选项,但最简单的方法可能是将SelectedItem的{​​{1}}绑定到viewmodel中的属性

ListView

我已使用INotifyPropertyChangedCallerMemberNameAttributepublic 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),视图模型中的属性已更改,并为视图提供更新内容的机会。 BindableProperty是语法糖,可以省略要调用的属性的名称CallerMemberNameAttribute。它与你打电话

基本相同
OnPropertyChangedFrom

在您看来,您现在可以将OnPropertyChanged(nameof(SelectedPerson)); 绑定到ListView

SelectedPerson

并在<ListView ... SelectedItem="{Binding SelectedPerson}">...</ListView> 中使用SelectedPerson