WPFを中心に書いています。Technologies。書いていた記事がなんだか全面的に誤っていたことに気が付いたのでリライトします。ListViewで行が選択されたとき、それをコマンドに渡しつつ選択された行をクリアする最も冴えたやり方は次の通りでした。ListViewのSelectedItemをハンドルするその際に渡されるSelectedItemChangedEventArgsのSelectedItemプロパティをCommandに渡すその後、ListViewのSelectedItemをクリアするクリアする際に、SelectedItemイベントが再度飛んでくるので、変更後のプロパティがnullだったら即リターンするようにするのがポイントです。これをBehaviorにするといいでしょう。コードはこんな感じになります。これだけだと親のBindingContextが変わったときに正しく動かなかったりするので、以下のライブラリに含まれているので使うといいと思います(ダイマ!www.nuget.orgまぁ、その辺をちゃんと対応したコードも公開しているので、そちらを使っていただいてもよいでしょう。github.com以下、下記の恥ずかしい残骸を一応残しておきます。疑問形にすると(ryしかも別に一つじゃないんですけどごめんなさい。前に、かずきさんも類似の記事をアップされていました。blog.okazuki.jpやりたい事はほとんど同じです。BlueMonkeyプロジェクトで、どう実装するかSlackで話していてでた話だからです。ちなみにBlueMonkeyプロジェクトって何?という方はぜひこちらをご覧ください。ytabuchi.hatenablog.comさて、そもそも何故にこれが検討の課題になったかというと、単純にやるといくつか問題があるためです。その点の整理から入っていきたいと思います。エントリーは、イベントに反応してCommandを実行するBehaviorの知識を前提として進めていきます。ご存じない方はまずこちらをご覧ください。www.nuits.jp課題の整理さて、簡単に思える解決策は幾つかあります。SelectedItemプロパティにバインドする方法ItemTappedイベントをハンドルしてコマンドを実行する方法ItemSelectedイベントをハンドルしてコマンドを実行する方法これらを単純に採用するとイケていない理由をまず説明したいと思います。SelectedItemプロパティにバインドする方法これは単純な主に二つの理由があります。ListViewの初期化時にnullが渡されてくる為、無駄なif分を書かなくてはならない。ダサい一度選択すると、選択状態が維持されるため二回目の選択時にイベントが発生しないまぁゴリゴリやればこれらの問題は回避できます。あと、Xamarin.Formsでは未確認ですが、WPFなどではプロパティのGet・Set時に例外が発生すると、その処理されない例外は握りつぶされグローバルな例外ハンドラなどでは処理できないという問題もありました。そもそも、プロパティの取得・設定時に複雑な処理するのは好ましくありません(非同期処理とかどうするのか?など)、Commandを利用するべきでしょう。ItemTappedイベントをハンドルしてコマンドを実行する方法EventToCommandBehaviorでTappedイベントをハンドルして、IValueConverterを利用してItemTappedEventArgsから選択された行のオブジェクトを取得すればいい。そんな風に考えていた時代が僕にもありました。この方法は一見うまく行きます。実際のケースを考えた時、うまく行かない場合があります。ListViewで行を選択して何らかの処理をする場合、スマートフォンの場合は詳細画面へ遷移するケースが多いと思います。そこまでは問題ありません。問題は詳細画面から一覧画面へ戻ってきたときに、「選択状態が保持されたままになってかっちょ悪い」という事です。Xamarin.FormsのNavigationPageを使った画面遷移では、遷移すると前画面はNavigationStack上にインスタンスが保持されているため、戻った時に選択状態が維持されたままとなるわけです。遷移前に選択状態を開放してあげればいいんじゃない?と思いますよね?私も思いました。「AndroidとiOSでItemTappedイベントとItemSelectedイベントの発行順がことなる」のです。イベントの順序に依存する解放はよろしく無いですし、SelectedItemを触りたいなら、ItemTappedイベントの中から触るのは避けた方が無難でしょう。ItemSelectedイベントをハンドルしてコマンドを実行する方法これで大体うまく行くのですが、「遷移して戻ってきたときに選択されっぱなし問題」は依然発生するため、次の解法をお勧めします。あと、そのままだと同じ行を選択できない気もします。本質的には、かずきさんの方法とほぼ同じです。ItemTappedかItemSelectedイベントをハンドルしてCommandを実行してあげるItemSelected発生時に、SelectedItemをクリアしておいてあげるかずきさんの解法では、これらを二つのBehaviorで個別に対応していましたが、BlueMonkeyプロジェクトでは、次のような専用Behaviorを作成することにしました。ふたつに分けた方が汎用性は高く、一つにまとめた方が実装効率や見通しは良くなるため、利用の際にはよく検討した上で選択してください。ItemSelectedToCommandBehaviorベースとなっているBaseBehaviorについてはこちらをご覧ください。wit...エレガントは言い過ぎ&タイトル長い上&ダイマでごめんなさい...2017-06-10【Xamarin.Forms】汎用的なBehavior集ライブラリを作ってるふと思い立って、汎用的なBehaviorライブラリを作ってます。(1)はてなブログをはじめよう!nuitsjpさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。