【WPF】TabControlのSelectedItemが機能しない時の対処

こんにちは、働く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);

ちなみに、起きないことも多く、
発生する条件や、
なぜこの対応で直るのかはよく分かっていません。

コメント

タイトルとURLをコピーしました