listview - Xamarin ListView itemSelected MVVM

标签 listview xamarin mvvm xamarin.forms

我对 Xamarin.Form 非常陌生,非常感谢您的帮助。

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

这是我的可绑定(bind)类:

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 如何获取值(value)。

我感谢您的帮助。

最佳答案

这里有几个选项,但最简单的可能是绑定(bind) SelectedItem您的ListView到您的 View 模型中的属性

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));
}

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

在您看来,您现在可以绑定(bind) ListViewSelectedPerson
<ListView ... SelectedItem="{Binding SelectedPerson}">...</ListView>

并使用 SelectedPersonPathToDetailView .

关于listview - Xamarin ListView itemSelected MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475894/

相关文章:

Android忽略滚动条大小

c# - 清除 Xamarin Forms 中的所有字段

xamarin - 如何在 OSX 中获取显示器 EDID?

c# - 将 MediaElement 的源属性绑定(bind)到 FileInfo

c# - 在 DataGrid WPF MVVM 中重新加载数据后如何保持对行的关注

wpf - 在 WPF 和 MVVM 中使用 ObservableCollections

android - 将子项添加到 Android 中的 ListView

android - 单选按钮在 ListView 中无法正常工作

java - 隐藏 Wicket WebMarkupContainer 将不起作用

java - Xamarin.Android 绑定(bind)调用 java 对象方法