Xamarin.Forms Prism 変な方法でListViewの項目選択時の処理

こんにちは。レモンティーです。

PrismでListViewを使っていると
Listの項目が選択された時、
そのオブジェクトをパラメーターにして
別のページに飛びたい時とかに最初は手が止まるかと思います。

MVVMとか意識しなければ簡単にItemSelectedイベントが拾えますが
コードビハインドに書かないで拾いたいわけですからね。

まずはそんな時のちゃんとした解決方を紹介します。

結論から言うと、そんな時の対処はBehaviorを使えばいいそうです。
↓でわかりやすく解説されています。
Xamarin.FormsでListViewタップ時にコマンドを実行させるBehaviorを使ってみた | 勝手にオザマリン

なお、↑のサイトではBehaviorを↓のようなクラスを継承して作っているようです。
xamarin-forms/BehaviorBase.cs at master · davidbritch/xamarin-forms · GitHub



…はい。というわけで真面目な解決方はOKですね。

ここからは変な話です。


まあMVVMの定石に従わないならそもそもコードビハインドに書けばいいので
全く真似する価値はありませんが、プロパティだけでやる方法です

Itemがタップされれば当然SelectedItemプロパティが変化しますので、
これをバインディングして、Setで処理を呼ぼうという考えです笑

コードはこんな感じです。
(簡略化のため書いていませんがItemsSourceもバインディングしています。)

Xaml

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

ViewModel

private object _selectedItem;

public object SelectedItem
{
    get{return _selectedItem;}
    set
    {
        SetProperty(ref _selectedItem,value);
        DoSomething(value);
    }
}

これで、コードビハインドにItemSelectedイベントを書いた時みたいに動きます。

例えば以下だと、stringのListから選択した項目をラベルに表示します。
(LabelTextはラベルのTextプロパティにバインディングされています。)

private object _selectedItem;

public object SelectedItem
{
    get{return _selectedItem;}
    set
    {
        SetProperty(ref _selectedItem,value);
        LabelText = (string)value;
    }
}


まあ使い時は無いです笑


今回はこれでおしまいです。
www.sawalemontea.com