2017-09-28 19 views
0

私はXamarin.Formの新機能です。ご協力いただきありがとうございます。Xamarin ListView itemSelected MVVM

現在のプロジェクトで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の次のステップについて確認していません。 私は私が一種の取得する方法DetailViewPageで立ち往生しています。このメソッドに

void PathToDetailView() 
{ 
    //Which I do not know what should go here to redirect to DetailsPage for each item. 
} 

を作成し、私は

DetailView = new Command(PathToDetailView); 

を追加私のコンストラクタで

public ICommand DetailView { get; set; } 

方法をexacuteするICommandのプロパティを作成値。

ご協力いただきありがとうございます。

答えて

0

あなたはここにいくつかのオプションがありますが、最も簡単で、私はINotifyPropertyChangedCallerMemberNameAttributeの使用を作ったあなたのviewmodelにプロパティに

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

をごListViewSelectedItemをバインドすることであってもよいです。 INotifyPropertyChangedはあなたのビュー(またはあなたのBindableProperty)に、あなたのビューモデルのプロパティが変更されたことを通知し、ビューにコンテンツを更新する機会を与えます。 CallerMemberNameAttributeは構文的な砂糖なので、呼び出すプロパティの名前を省略することができますOnPropertyChangedFrom。それはあなたのビューで

OnPropertyChanged(nameof(SelectedPerson)); 

と呼ばれるかのように、あなたが今SelectedPerson

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

PathToDetailViewSelectedPersonを使用するListViewをバインドすることができ、基本的に同じです。

関連する問題