WPF DataGridのSelectedItemプロパティにバインド
ちゃんと検証していないけど結構はまったので考察します。
DataGridで選択中の行をViewModelで把握するために、
SelectedItemプロパティにバインド。
が、DataGridが一行しかないとき、画面でクリックしてもなにしても、
ViewModel側のSetterに飛んでこない。
一回でもモデル側でコレクションをリフレッシュし、
DataGridにバインドしているコレクションを更新するとSelectedItemプロパティにバインドしているViewModelのプロパティが更新される。
ViewのコードビハインドでDataGridのプロパティを洗ってみると、
View側は先頭行が選択状態になっていたが、ViewModelに通知されておらず、
以降画面でクリックしてもなにしても、Viewはプロパティの更新なしと判断してViewModel側に更新通知をしていなかった。
つまり、
View⇒DataGridの先頭行を選択
ViewModel⇒SelectedItemプロパティにバインドしているけど、選択されていない状態
という具合になっていた模様。
この時、BindingのModeはTwoWayになっていたが、
これをOneWayに変更すると画面を表示した直後からViewModel側にもSelectedItemプロパティの値が設定されていた。
==以下予想==
・バインドの初期化はDataContextプロパティにViewModelのインスタンスを渡した瞬間に実行されるわけではない?
・「対象Viewの描画されている状態」かつ「DataContextにViewModelが渡された状態」になった時にバインドの初期化処理が実行される?
⇒調査中DataContextにプロパティを設定する処理とViewを描画する処理を入れ替えてみたら、ViewModelのGetterはその時の後のステップに反応していた。
・初期化処理はTwoWayの場合、ViewModel⇒View、OneWayの場合View⇒ViewModelの方向でしか実行されない???
・DataGrid自体がBindingの有無に関わらず、自動的に先頭行がSelectedItemに格納されると仮定すると、TwoWayで上手く行かず、OneWayで上手くいったのも納得出来る。WindowsForm時代のDataGridViewでも似たような話があったような・・・