こんにちは、働くC#プログラマーのさんさめです。
今回の話は、
全容は掴めていないもののこうしたら直った、
という知見の共有です。
TabControlといえば、
主に設定画面など、
情報量が多い領域をグループ化し
省レイアウトのために使われるコントロールです。
一方で、ItemsSourceプロパティに
コレクションをBindingし、
ItemTemplateとContentTemplateを記述することで、
同レイアウトのものをタブ化することができます。
使う側は、
インターネットブラウザのような感覚で
操作することが可能です。
ところが、
この使い方をするとき、
ハマりポイントがあります。
それは、
「SelectedItemをBindingして
ViewModel側から設定しても
TabControlに反映されないことがある」
というものです。
この問題は、
ItemsSourceにBindingしている
コレクションへの追加より後に
ViewModel側から
SelectedItemにBindingしているプロパティに対して
セットを行うと発生します。
コードにするとこういうことです。
var newVm = new ItemViewModel();
Collections.Add(newVm);
SelectedViewModel = newVm;
この処理の順序を反対にする、
つまり、
「まだコレクションに追加していないViewModelを
SelectedItemに入れる」
という一見直感に反するコードを書くと、
この問題は改善します。
var newVm = new ItemViewModel();
SelectedViewModel = newVm; // 先に設定する
Collections.Add(newVm);
ちなみに、起きないことも多く、
発生する条件や、
なぜこの対応で直るのかはよく分かっていません。
コメント