3

MvvmCross を使用して、Xamarin 経由で Android にアプリを作成しています。

私はしばらくこの問題に取り組んできましたが、回避策を見つけましたが、これは正しい方法ではないと確信しています。

これは、MvxListView で選択された項目に関するものです。

<Mvx.MvxListView
  android:id="@+id/productSearchResultListView"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  local:MvxBind="ItemsSource ProductSearchResultLst; SelectedItem SelectedProductSearchResult"
  local:MvxItemTemplate="@layout/productsearchresult_row" />

このリストのアイテムが選択されると、ユーザーはこのアイテムが処理されるページに転送されます。これが完了すると、ユーザーは「確認」をクリックして、このリストに戻ります。この時点で、選択した項目が強調表示されますが (これは気に入っています)、再度クリックすることはできません。つまり、再度クリックしても項目は開かれません。理由はわかります。選択項目の変更はありません。ただし、ビューモデルの選択済みアイテム SelectedProductSearchResult の選択を解除できないようです。ビューからの「OnRestart」イベントで「null」に設定しました。ただし、アイテムを再度選択すると、選択したアイテムのセッターに到達しません。 .

また、ビューで ClearChoices と SetItemChecked を直接使用しましたが、これは VM の選択された項目の選択を解除しないため、役に立ちません。

最後に、選択したアイテムが変更されていない (同じオブジェクト) ため、セッターに到達していないことがわかりました。ビューモデルの OnRestart メソッドに次の部分を含めました。これにより、すべての項目が新しいオブジェクトであるという意味でリストが更新されます。

var productLst = new List<WHM_PRODUCT> ();
foreach (var item in ProductSearchResultLst)
     productLst.Add (item.Clone());

ProductSearchResultLst = new ObservableCollection<WHM_PRODUCT> (productLst);

これは機能しますが、オブジェクトごとに個別にこれを行う必要があることを意味するため、これは非常にばかげていると思います。

これを行うためのより良い方法があるはずです。

どんなフィードバックでも大歓迎です!

ステファーン

4

1 に答える 1

4

ビューモデルのコードは含まれていませんでしたが、SelectedProductSearchResultプロパティのセッターでナビゲーションロジックを実行していると思います。これは標準的なアプローチではなく、代わりにCommandを使用する必要があります。

最初にビューモデルに Command プロパティを実装します。

public ICommand NavigateToDetailCommand
        {
            get
            {
                return new MvxCommand<WHM_PRODUCT>(item =>
                {
                    //Perform navigation logic here
                    ShowViewModel<DetailViewModel>(new { id = item.Id });
                });
            }
        }

次に、MvxListView の ItemClick にバインドします。

local:MvxBind="ItemsSource ProductSearchResultLst; ItemClick NavigateToDetailCommand"

ユーザーがリスト項目をクリックすると、コマンドが実行され、関連する項目がパラメーターとして渡されます。

于 2015-05-02T21:36:25.393 に答える