我对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如何获取值。
感谢您的帮助。
答案 0 :(得分:0)
这里有几个选项,但最简单的方法可能是将SelectedItem
的{{1}}绑定到viewmodel中的属性
ListView
我已使用INotifyPropertyChanged和CallerMemberNameAttribute。 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
),视图模型中的属性已更改,并为视图提供更新内容的机会。 BindableProperty
是语法糖,可以省略要调用的属性的名称CallerMemberNameAttribute
。它与你打电话
OnPropertyChangedFrom
在您看来,您现在可以将OnPropertyChanged(nameof(SelectedPerson));
绑定到ListView
SelectedPerson
并在<ListView ... SelectedItem="{Binding SelectedPerson}">...</ListView>
中使用SelectedPerson
。