読者です 読者をやめる 読者になる 読者になる

No more Death March

あるSEのチラシの裏 C# WPF

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でも似たような話があったような・・・