【问题标题】:Xamarin ListView itemSelected MVVMXamarin 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 如何获取值。

感谢您的帮助。

【问题讨论】:

    标签: listview xamarin mvvm xamarin.forms


    【解决方案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));
    }
    

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

    OnPropertyChanged(nameof(SelectedPerson));
    

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

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

    并在PathToDetailView 中使用SelectedPerson

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2017-02-04
      • 2014-09-07
      • 2017-01-11
      • 1970-01-01
      • 2018-08-14
      相关资源
      最近更新 更多